基于Socket的Java网络编程集粹
### 基于Socket的Java网络编程集粹 #### 核心知识点概述: 本文将深入探讨基于Socket的Java网络编程技术及其应用场景。Socket是网络通信的基础之一,它为应用程序提供了在不同计算机之间发送数据的能力。Java作为一种广泛使用的编程语言,为开发者提供了强大的Socket API来实现网络通信功能。 #### 一、Socket基础概念 - **Socket定义**:Socket可以理解为两台机器之间通信的端点,它是网络中进程间通信的一种方式。 - **Socket分类**: - **流式套接字(Stream Socket)**:提供面向连接的服务,通常基于TCP协议。 - **数据报套接字(Datagram Socket)**:不提供连接服务,基于UDP协议。 - **Socket通信模型**:客户端-服务器模型是最常见的Socket通信模型,其中服务器端负责监听并接收来自客户端的连接请求。 #### 二、Java中的Socket API介绍 Java提供了丰富的API支持Socket编程,主要包括以下几个核心类: - **ServerSocket**:用于创建服务器端Socket对象,监听特定端口,等待客户端连接。 - **Socket**:表示客户端Socket对象,用于建立与服务器的连接。 - **InetAddress**:用于表示Internet地址(如IP地址)。 - **输入输出流**:通过Socket进行数据交换的主要方式,包括`InputStream`、`OutputStream`、`BufferedReader`、`PrintWriter`等。 #### 三、Socket编程示例 ##### 服务器端示例代码分析 ```java import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(5678); // 创建服务器端Socket,监听5678端口 Socket client = server.accept(); // 接受客户端连接 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); // 创建输入流 PrintWriter out = new PrintWriter(client.getOutputStream()); // 创建输出流 while (true) { String str = in.readLine(); System.out.println(str); out.println("has receive."); out.flush(); if ("end".equals(str)) break; // 如果客户端发送"end"则退出循环 } client.close(); // 关闭客户端Socket } } ``` **解析**: - 通过`ServerSocket(5678)`创建服务器端Socket,并指定监听端口为5678。 - `server.accept()`方法阻塞等待客户端连接。 - 使用`BufferedReader`和`PrintWriter`处理输入输出数据。 ##### 客户端示例代码分析 ```java import java.net.*; import java.io.*; public class Client { static Socket server; public static void main(String[] args) throws Exception { server = new Socket(InetAddress.getLocalHost(), 5678); // 连接到服务器端 BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); // 创建输入流 PrintWriter out = new PrintWriter(server.getOutputStream()); // 创建输出流 BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); // 获取标准输入 while (true) { String str = wt.readLine(); out.println(str); out.flush(); if ("end".equals(str)) break; // 发送"end"后退出循环 System.out.println(in.readLine()); } server.close(); // 关闭客户端Socket } } ``` **解析**: - 通过`Socket(InetAddress.getLocalHost(), 5678)`连接到服务器端。 - 同样使用`BufferedReader`和`PrintWriter`处理输入输出数据。 - 用户可以通过标准输入向服务器发送消息。 #### 四、注意事项 - **端口号选择**:确保选择的端口号未被其他服务占用,且最好避免使用1024以下的端口号,因为这些端口号通常是保留给系统服务的。 - **异常处理**:在网络编程中,必须妥善处理可能出现的各种异常情况,如连接失败、读写错误等。 - **资源管理**:正确关闭Socket和相关的输入输出流,防止资源泄漏。 #### 五、高级话题 - **并发处理**:在实际应用中,服务器通常需要同时处理多个客户端连接。可以采用多线程或线程池的方式实现并发处理。 - **安全通信**:对于敏感数据的传输,可以考虑使用SSL/TLS等加密协议确保数据的安全性。 #### 六、总结 基于Socket的Java网络编程是构建分布式应用和服务的重要技术之一。通过掌握上述知识点,开发者能够更加熟练地利用Java进行网络通信开发,构建高效稳定的网络应用程序。
网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。
Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
上面的方法基本可以建立一条连线让两台计算机相互交流了,可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的,除非远程调用,处理问题的核心在执行上,否则数据的交互还是依赖于IO操作的,所以你也必须导入java.io这个包.java的IO操作也不复杂,它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。
BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作,而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出,那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了。
服务方:
import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(5678);
Socket client=server.accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
while(true){
String str=in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if(str.equals("end"))
break;
}
- 75老猿2011-09-16挺不错的例子,可以做入门例子
- 粉丝: 3
- 资源: 151
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助