在Java中,使用Socket通信實(shí)現(xiàn)多線程主要涉及到服務(wù)器端和客戶端的處理。下面分別介紹服務(wù)器端和客戶端如何實(shí)現(xiàn)多線程。
服務(wù)器端需要?jiǎng)?chuàng)建一個(gè)線程池來處理客戶端的連接請(qǐng)求。當(dāng)客戶端連接到服務(wù)器時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)新的線程來處理與該客戶端的通信。這樣可以確保服務(wù)器能夠同時(shí)處理多個(gè)客戶端的請(qǐng)求。
以下是一個(gè)簡(jiǎn)單的服務(wù)器端多線程實(shí)現(xiàn)示例:
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
int port = 12345;
ExecutorService executorService = Executors.newFixedThreadPool(10); // 創(chuàng)建一個(gè)固定大小的線程池
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
try (Socket socket = serverSocket.accept()) {
executorService.submit(() -> handleClient(socket)); // 將客戶端連接請(qǐng)求提交給線程池處理
} catch (IOException e) {
System.out.println("Error accepting client connection: " + e.getMessage());
}
}
} finally {
executorService.shutdown(); // 關(guān)閉線程池
}
}
private static void handleClient(Socket socket) {
try {
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String message;
while ((message = reader.readLine()) != null) {
System.out.println("Received from client: " + message);
// 處理客戶端發(fā)送的消息
}
} catch (IOException e) {
System.out.println("Error handling client communication: " + e.getMessage());
} finally {
try {
socket.close();
} catch (IOException e) {
System.out.println("Error closing client socket: " + e.getMessage());
}
}
}
}
客戶端也可以使用多線程來實(shí)現(xiàn)多個(gè)連接的并發(fā)處理。例如,可以創(chuàng)建一個(gè)線程池,并為每個(gè)需要連接的服務(wù)器端端口分配一個(gè)線程。
以下是一個(gè)簡(jiǎn)單的客戶端多線程實(shí)現(xiàn)示例:
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
String serverAddress = "localhost";
int serverPort = 12345;
int numberOfConnections = 5; // 需要連接的服務(wù)器端端口數(shù)量
ExecutorService executorService = Executors.newFixedThreadPool(numberOfConnections); // 創(chuàng)建一個(gè)固定大小的線程池
for (int i = 0; i < numberOfConnections; i++) {
executorService.submit(() -> connectToServer(serverAddress, serverPort)); // 將連接請(qǐng)求提交給線程池處理
}
executorService.shutdown(); // 關(guān)閉線程池
}
private static void connectToServer(String serverAddress, int serverPort) throws IOException {
try (Socket socket = new Socket(serverAddress, serverPort);
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String message;
while ((message = reader.readLine()) != null) {
System.out.println("Received from server: " + message);
// 處理服務(wù)器發(fā)送的消息
}
} catch (IOException e) {
System.out.println("Error connecting to server: " + e.getMessage());
}
}
}
這個(gè)示例中,客戶端創(chuàng)建了5個(gè)線程,每個(gè)線程都嘗試連接到服務(wù)器。服務(wù)器端使用線程池處理客戶端的連接請(qǐng)求。這樣,客戶端和服務(wù)器端都可以實(shí)現(xiàn)多線程通信。