在单独的线程中创建ServerSocket?

我在我的应用程序中使用ServerSocket遇到问题。

我正在我的应用程序的构造函数中创建ServerSocket 。 套接字的构造函数调用accept()方法等待客户端连接。

问题是accept()方法冻结了我的整个应用程序,直到客户端连接。 所以我想问一下,如果在一个单独的线程中创建整个ServerSocket是否有另一种选择,那么在我的主应用程序旁边调用ServerSocket的构造函数及其accept()方法?

编辑:

感谢Olivier的建议,将.accept放入runnable并创建一个线程池来处理客户端连接。

这就是我现在的代码:

  public void start(){ final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10); Runnable serverTask = new Runnable() { @Override public void run() { try { serverSocket = new ServerSocket(port); while (true) { Socket clientSocket = serverSocket.accept(); objectout = new ObjectOutputStream(clientSocket.getOutputStream()); clientProcessingPool.submit(new ClientTask(clientSocket,objectout)); } } catch (IOException e) { System.err.println("Accept failed."); } } }; 

万事都好! 谢谢!

通常,我使用N + 1个线程:一个用于ServerSocket,以避免阻塞整个应用程序等待客户端连接; 和N个线程来处理客户端的请求,N是线程池的大小(我建议使用线程池而不是为每个客户端创建一个新线程)。

这是一个例子(只是编码它,您可能希望有更好的exception管理等,但这是一个最小的工作示例)

 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(); } } } }