首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在单独的线程中创建ServerSocket?

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

Stack Overflow用户
提问于 2013-03-21 15:33:18
回答 1查看 39.1K关注 0票数 26

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

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

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

编辑:

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

这就是我现在的代码:

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

          }
      };

一切运行得很好!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 15:37:57

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

}
票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15541804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档