Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确停止serverSocket.accept()_Java_Sockets_Java.util.concurrent - Fatal编程技术网

Java 如何正确停止serverSocket.accept()

Java 如何正确停止serverSocket.accept(),java,sockets,java.util.concurrent,Java,Sockets,Java.util.concurrent,我正在编写一个简单的客户机/服务器聊天程序。服务器以这种方式处理多个客户端: public void start(int port) { (new Thread(new Runnable() { @Override public void run() { try{ serverSocket = new ServerSocket(port); SocketHand

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

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(){}关闭创建的各种套接字。我的问题是:

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

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

  • 我可以使用Executor服务,然后立即呼叫关机吗?关机现在能够停止accept()调用吗?因为api文档声明它不能保证成功

  • 请随时指出我所做的任何错误/糟糕的设计选择。Ty

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

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

    accept()
    SocketInputStream.read()
    DatagramSocket.receive()

    必须在进入要执行的阻塞操作之前设置该选项 效果。如果超时过期,操作将继续 块,引发java.io.InterruptedIOException。插座不在 在这种情况下关闭


    这是停止这种服务器的正确方法吗

    正如您所说,这是一个服务器,这意味着您不需要停止它,但在特殊情况下


    正如你所说的:

    除了尽最大努力尝试停止处理外,没有其他保证 积极执行任务


    仅仅因为在
    accept()
    中出现错误而关闭所有处理程序是不正确的。当客户端断开连接时,或者通过读取超时,您应该让它们以自己的方式完成。