Java的Socket编程是一种基于TCP/IP协议的通信方式,可以用于在客户端和服务器之间建立网络连接,实现数据传输。以下是Socket编程的简单示例,分别展示了服务器端和客户端的实现。
一、服务端代码
服务端使用ServerSocket
来监听客户端的连接请求,并用Socket
对象来进行数据传输。
java">import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8080)) {System.out.println("Server is listening on port 8080");while (true) {Socket clientSocket = serverSocket.accept();// 获取客户端的IP地址和端口号String clientAddress = clientSocket.getInetAddress().getHostAddress();int clientPort = clientSocket.getPort();System.out.println("New client connected: " + clientAddress + ":" + clientPort);// 启动一个新线程处理该客户端的通信new Thread(new ClientHandler(clientSocket, clientAddress, clientPort)).start();}} catch (Exception e) {e.printStackTrace();}}
}class ClientHandler implements Runnable {private final Socket clientSocket;private final String clientAddress;private final int clientPort;public ClientHandler(Socket socket, String address, int port) {this.clientSocket = socket;this.clientAddress = address;this.clientPort = port;}@Overridepublic void run() {try (BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);) {String message;while (true) {// 接收客户端消息message = input.readLine();if ("exit".equalsIgnoreCase(message)) {System.out.println("Client " + clientAddress + ":" + clientPort + " disconnected");break;}System.out.println("Message from " + clientAddress + ":" + clientPort + ": " + message);// 从控制台读取服务端回复System.out.print("Reply to " + clientAddress + ":" + clientPort + ": ");message = new BufferedReader(new InputStreamReader(System.in)).readLine();output.println(message);if ("exit".equalsIgnoreCase(message)) {System.out.println("Server closed the connection with " + clientAddress + ":" + clientPort);break;}}} catch (Exception e) {e.printStackTrace();} finally {try {clientSocket.close();} catch (Exception e) {e.printStackTrace();}}}
}
二、客户端代码
客户端使用Socket
连接到服务器,并通过输入输出流与服务器进行通信。
java">import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class Client {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8080);BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter output = new PrintWriter(socket.getOutputStream(), true);BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in))) {System.out.println("Connected to the server");String message;while (true) {// 从控制台读取客户端输入System.out.print("Client: ");message = consoleInput.readLine();output.println(message); // 发送消息到服务器if ("exit".equalsIgnoreCase(message)) {System.out.println("Client closed the connection");break;}// 接收服务器的回复message = input.readLine();if ("exit".equalsIgnoreCase(message)) {System.out.println("Server closed the connection");break;}System.out.println("Server: " + message);}} catch (Exception e) {e.printStackTrace();}}
}
三、运行步骤
- 启动服务器:首先运行
Server
类,服务器会开始监听端口8080。 - 启动客户端:运行
Client
类,客户端会连接到服务器并发送消息。 - 查看结果:在服务器端和客户端控制台可以看到相互发送和接收的消息。
-
服务器端:
- 使用
ServerSocket
监听指定端口(例如8080)。 - 当客户端连接时,接受连接请求并建立一个
Socket
。 - 使用输入输出流
BufferedReader
和PrintWriter
与客户端通信。 - 每当有客户端连接时,启动一个新线程
ClientHandler
来处理该客户端的通信。 - 在
ClientHandler
中,使用循环接收客户端消息并回消息到客户端,输入"exit"
时断开连接并退出循环。
- 使用
-
客户端:
- 使用
Socket
连接到服务器(IP地址为localhost,端口8080)。 - 创建输入输出流,与服务器进行消息收发。
- 使用
五、注意事项
- 端口冲突:确保端口8080未被其他应用占用。
- 关闭连接:可以使用
try-with-resources
自动关闭Socket和流。 - 多线程:为支持多个客户端,可以使用多线程来处理每个客户端请求。