【发布时间】:2018-01-22 23:19:54
【问题描述】:
我正在编写一个简单的客户端/服务器聊天程序。服务器以这种方式处理多个客户端:
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 并无限期地等待客户端连接。每当用户想要关闭服务器时,服务器 Socket 就会关闭,这会导致 accept() 失败并抛出异常。然后 catch(){} 关闭创建的各种套接字。我的问题是:
是否必须关闭通过 serverSocket.accept() 创建的每个套接字?
这是停止此类服务器的正确方法吗? while(true) + 在非异常情况下使用异常对我来说感觉很不对劲。有没有更好的办法?
- 我可以使用 ExecutorService,然后在其上调用 shutdownNow 吗? shutdownNow 能否停止 accept() 调用?因为 api 文档声明它不能保证成功。
请随时指出我所做的任何错误/糟糕的设计选择。类型
【问题讨论】:
-
仅仅因为
accept()出现错误而关闭所有处理程序是不正确的。当他们的客户端断开连接或通过读取超时时,您应该让他们以自己的方式完成。
标签: java sockets java.util.concurrent