通常,我为此使用N +
1个线程:一个用于ServerSocket,以避免阻塞整个应用程序等待客户端连接;另一个用于服务器套接字。和N个线程来处理客户端的请求,N是线程池的大小(与每个客户端创建新线程相比,我建议使用线程池)。
这是一个示例(只需对其进行编码,您可能希望拥有更好的异常管理等功能,但这只是一个最小的工作示例)
public class Server { public static void main(String[] args) { new Server().startServer(); } public void startServer() { final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10); Runnable serverTask = new Runnable() { @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(8000); System.out.println("Waiting for clients to connect..."); while (true) { Socket clientSocket = serverSocket.accept(); clientProcessingPool.submit(new ClientTask(clientSocket)); } } catch (IOException e) { System.err.println("Unable to process client request"); e.printStackTrace(); } } }; Thread serverThread = new Thread(serverTask); serverThread.start(); } private class ClientTask implements Runnable { private final Socket clientSocket; private ClientTask(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { System.out.println("Got a client !"); // Do whatever required to process the client's request try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }}


