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(){}关闭创建的各种套接字。我的问题是:
请随时指出我所做的任何错误/糟糕的设计选择。Ty您可以使用该方法手动关闭连接(客户端/服务器端),也可以设置一个 设置阻止套接字操作的超时: accept()
SocketInputStream.read()
DatagramSocket.receive() 必须在进入要执行的阻塞操作之前设置该选项 效果。如果超时过期,操作将继续 块,引发java.io.InterruptedIOException。插座不在 在这种情况下关闭
这是停止这种服务器的正确方法吗 正如您所说,这是一个服务器,这意味着您不需要停止它,但在特殊情况下
正如你所说的: 除了尽最大努力尝试停止处理外,没有其他保证 积极执行任务
仅仅因为在
accept()
中出现错误而关闭所有处理程序是不正确的。当客户端断开连接时,或者通过读取超时,您应该让它们以自己的方式完成。