Java 实例 - Socket 实现多线程服务器程序
在 Java 中,实现一个多线程服务器程序可以通过使用 ServerSocket
来监听客户端连接,每当有新的客户端连接时,启动一个新的线程来处理该连接。下面是一个示例代码,展示了如何使用 Java Socket 实现一个多线程服务器程序。
服务器端代码
首先,我们创建一个服务器端程序,它会监听指定的端口,并为每个客户端连接启动一个新的线程来处理通信。
MultiThreadedServer.java 文件
import java.io.*;
import java.net.*;
public class MultiThreadedServer {
public static void main(String[] args) {
int port = 12345; // 定义服务器端口
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept(); // 接受客户端连接
System.out.println("客户端已连接: " + clientSocket.getInetAddress().getHostAddress());
// 为每个客户端连接启动一个新的线程
ClientHandler clientHandler = new ClientHandler(clientSocket);
new Thread(clientHandler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try (
InputStream input = clientSocket.getInputStream();
OutputStream output = clientSocket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
PrintWriter writer = new PrintWriter(output, true)
) {
String clientMessage;
while ((clientMessage = reader.readLine()) != null) {
System.out.println("收到客户端消息: " + clientMessage);
writer.println("服务器回应: " + clientMessage); // 发送回应消息给客户端
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码
客户端代码用于连接服务器并发送消息。可以创建多个客户端来测试服务器的多线程处理能力。
Client.java 文件代码:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 12345; // 服务器端口
try (Socket socket = new Socket(serverAddress, port)) {
System.out.println("已连接到服务器");
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = consoleReader.readLine()) != null) {
writer.println(userInput);
String serverResponse = reader.readLine();
System.out.println("服务器回应: " + serverResponse);
}
} catch (UnknownHostException e) {
System.err.println("不明主机: " + serverAddress);
e.printStackTrace();
} catch (IOException e) {
System.err.println("无法获取 I/O 连接到: " + serverAddress);
e.printStackTrace();
}
}
}
import java.net.*;
public class Client {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 12345; // 服务器端口
try (Socket socket = new Socket(serverAddress, port)) {
System.out.println("已连接到服务器");
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = consoleReader.readLine()) != null) {
writer.println(userInput);
String serverResponse = reader.readLine();
System.out.println("服务器回应: " + serverResponse);
}
} catch (UnknownHostException e) {
System.err.println("不明主机: " + serverAddress);
e.printStackTrace();
} catch (IOException e) {
System.err.println("无法获取 I/O 连接到: " + serverAddress);
e.printStackTrace();
}
}
}
运行步骤
-
运行服务器端:
- 编译并运行
MultiThreadedServer
类。 - 服务器将启动并监听指定端口上的客户端连接。
- 编译并运行
-
运行客户端:
- 编译并运行多个
Client
类实例,模拟多个客户端连接到服务器。 - 在客户端控制台中输入消息,客户端会将消息发送到服务器,服务器将回应相同的消息。
- 编译并运行多个
解释
ServerSocket
: 服务器端用来监听客户端连接的套接字。Socket
: 客户端和服务器之间的通信通道。ClientHandler
: 处理每个客户端连接的线程类。BufferedReader
和PrintWriter
: 用于读取和写入数据流。
这种实现方式确保了服务器能够同时处理多个客户端连接,而不会因为一个客户端的长时间操作而阻塞其他客户端的请求。
编译代码
打开终端或命令提示符,切换到存上述 Java 文件的目录,然后编译代码:
javac MultiThreadedServer.java Client.java
在编译完成后,首先运行服务器程序,服务器将启动并开始监听端口 12345。
java MultiThreadedServer
你会看到服务器输出:
服务器已启动,等待客户端连接...
打开另一个终端或命令提示符窗口,运行客户端程序。你可以运行多个客户端实例来测试多线程处理。
java Client
你会看到客户端输出:
已连接到服务器
然后,你可以在客户端控制台中输入消息,例如:
Hello Server
服务器会回应:
服务器回应: Hello Server
服务器端的输出会显示:
客户端已连接: 127.0.0.1 收到客户端消息: Hello Server