一、引言
在Java中,Socket编程是实现网络通信的一种重要方式。Socket是网络通信的基本单元,它提供了不同计算机之间的进程间通信的能力。通过Socket编程,我们可以创建出各种复杂的网络应用,如聊天室、文件传输、网络游戏等。本文将详细介绍Java Socket编程的基本概念、主要类和方法,并通过示例代码展示如何使用它们。
二、Socket编程的基本概念
1. 客户端与服务器
在Socket编程中,通常有两个角色:客户端(Client)和服务器(Server)。服务器监听某个端口上的连接请求,一旦有客户端请求连接,服务器就接受连接并与客户端建立通信。客户端则主动发起连接请求,与服务器建立连接后进行通信。
2. IP地址和端口号
IP地址用于唯一标识网络中的计算机,而端口号则用于唯一标识计算机中的进程。在Socket编程中,我们需要指定服务器的IP地址和端口号来建立连接。
3. TCP与UDP
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常用的网络传输协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是一种无连接的、不可靠的、基于数据报的传输层通信协议。在Java Socket编程中,我们通常使用TCP协议来建立可靠的连接。
三、Java Socket编程的主要类和方法
1. ServerSocket类
ServerSocket类用于创建服务器端的Socket对象。它有一个accept()方法,用于监听来自客户端的连接请求,并返回一个与客户端通信的Socket对象。
示例代码:
java复制代码
ServerSocket serverSocket = new ServerSocket(8888); // 监听8888端口 Socket clientSocket = serverSocket.accept(); // 等待客户端连接
2. Socket类
Socket类用于创建客户端的Socket对象。它有一个构造函数,用于指定服务器的IP地址和端口号,从而建立与服务器的连接。一旦连接建立,就可以使用getOutputStream()和getInputStream()方法获取输出流和输入流,用于向服务器发送数据和从服务器接收数据。
示例代码:
java复制代码
Socket socket = new Socket("localhost", 8888); // 连接本地主机的8888端口 OutputStream outputStream = socket.getOutputStream(); // 获取输出流 InputStream inputStream = socket.getInputStream(); // 获取输入流
3. 字节流与字符流
在Java中,通常使用字节流(InputStream和OutputStream)或字符流(Reader和Writer)来读写数据。对于Socket编程,我们通常使用字节流来传输数据,因为网络通信是基于字节的。但是,如果需要传输文本数据,也可以使用字符流进行封装。
4. 关闭Socket连接
在通信完成后,需要关闭Socket连接以释放资源。可以使用Socket类的close()方法关闭连接。同时,也需要注意在异常处理中关闭连接,以避免资源泄露。
四、示例代码:简单的Echo服务器与客户端
下面是一个简单的Echo服务器与客户端的示例代码,用于演示Java Socket编程的基本用法。
1. Echo服务器
java复制代码
public class EchoServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("Server started. Waiting for client..."); Socket clientSocket = serverSocket.accept(); System.out.println("Client connected. IP: " + clientSocket.getInetAddress().getHostAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); String message; while ((message = in.readLine()) != null) { System.out.println("Received: " + message); out.write("Echo: " + message); out.newLine(); out.flush(); } clientSocket.close(); serverSocket.close(); } }
2. Echo客户端
java复制代码
public class EchoClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); System.out.println("Connected to server."); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); Scanner scanner = new Scanner(System.in); while (true)