我正在编写一个简单的客户端/服务器聊天程序。服务器以这种方式处理多个客户端:
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()创建的每个套接字?
这是停止此类服务器的正确方法吗?虽然(真实)+在非特殊情况下使用例外情况对我来说是错误的。有更好的方法吗?
请随意指出我所做的任何错误/糟糕的设计选择。 TY
答案 0 :(得分:0)
您可以使用close()方法手动关闭连接(客户端/服务器端),也可以设置timeout。
设置阻止套接字操作的超时时间:
的ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();必须先设置该选项,然后才能进入阻止操作 影响。如果超时到期并且操作将继续 阻止,引发java.io.InterruptedIOException。套接字不是 在这种情况下关闭。
这是停止此类服务器的正确方法吗?
正如你所说它是一台服务器意味着你不需要在特殊条件下停止它。
正如您所说:shutdownNow() API说:
除了努力尝试停止处理之外,没有任何保证 积极执行任务。