[英]How to correctly stop serverSocket.accept()
我正在编写一个简单的客户端/服务器聊天程序。 服务器以这种方式处理多个客户端:
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()创建的每个套接字?
这是停止此类服务器的正确方法吗? 在非异常情况下使用while(true)+使用异常对我来说是非常错误的。 有没有更好的办法?
请随意指出我所做的任何错误/较差的设计选择。 泰
您可以使用close()方法手动(在客户端/服务器端)关闭连接,也可以设置超时 。
在阻止套接字操作上设置超时:
ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();必须先设置此选项,然后才能进入阻止操作。 如果超时到期并且操作将继续阻塞,则引发java.io.InterruptedIOException。 在这种情况下,套接字未关闭。
这是停止此类服务器的正确方法吗?
正如您所说的,这是一台服务器,这意味着您无需在特殊情况下停止它。
当您声明shutdownNow()API时,会说:
除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.