有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在单独的线程中创建ServerSocket?

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

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

问题是accept()方法正在冻结我的整个应用程序,直到客户端连接。所以我想问一下,除了在一个单独的线程中创建整个ServerSocket之外,是否还有其他方法,在我的主应用程序旁边调用ServerSocket及其accept()方法的构造函数

编辑:

多亏了奥利弗的建议,我才把这本书出版了。接受到一个可运行的线程池中,并创建一个线程池来处理clientconnections

这就是我现在的代码:

  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.");
              }

          }
      };

一切正常!谢谢


共 (1) 个答案

  1. # 1 楼答案

    通常,我使用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();
                }
            }
        }
    
    }