如何正确停止serverSocket.accept()

时间:2018-01-22 23:19:55

标签: java sockets java.util.concurrent

我正在编写一个简单的客户端/服务器聊天程序。服务器以这种方式处理多个客户端:

public void start(int port)
{
    (new Thread(new Runnable()
    {
        @Override
        public void run() {
            try{
                serverSocket = new ServerSocket(port);
                SocketHandler handler;
                while(true)
                {
                    handler = new SocketHandler(serverSocket.accept());
                    handlersList.add(handler);
                    (new Thread(new SocketHandler(socket))).start();
                }
            }catch(IOException e)
            {
                for(SocketHandler handler:handlersList)
                    handler.close();
            }
        }
    })).start();
}

public void stop() throws IOException
{
    serverSocket.close();
}

基本上start()实例化ServerSocket并等待客户端无限期地连接。每当用户想要关闭服务器时,服务器套接字就会关闭,这会导致accept()失败并抛出异常。然后catch(){}关闭创建的各种套接字。我的问题是:

  1. 我是否必须关闭通过serverSocket.accept()创建的每个套接字?

  2. 这是停止此类服务器的正确方法吗?虽然(真实)+在非特殊情况下使用例外情况对我来说是错误的。有更好的方法吗?

  3. 我可以使用ExecutorService然后只调用shutdownNow吗? shutdownNow能否停止accept()调用?因为api doc声明它不能保证成功。
  4. 请随意指出我所做的任何错误/糟糕的设计选择。 TY

1 个答案:

答案 0 :(得分:0)

您可以使用close()方法手动关闭连接(客户端/服务器端),也可以设置timeout

  

设置阻止套接字操作的超时时间:

     

的ServerSocket.accept();
  SocketInputStream.read();
  DatagramSocket.receive();

     

必须先设置该选项,然后才能进入阻止操作   影响。如果超时到期并且操作将继续   阻止,引发java.io.InterruptedIOException。套接字不是   在这种情况下关闭。

  

这是停止此类服务器的正确方法吗?

正如你所说它是一台服务器意味着你不需要在特殊条件下停止它。

正如您所说:shutdownNow() API说:

  

除了努力尝试停止处理之外,没有任何保证   积极执行任务。