gpt4 book ai didi

java - 如何正确停止serverSocket.accept()

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:13 26 4
gpt4 key购买 nike

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

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

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

  2. 这是停止此类服务器的正确方法吗? while(true) + 在非异常情况下使用异常对我来说感觉非常错误。有更好的办法吗?

  3. 我可以使用 ExecutorService 然后调用 shutdownNow 吗? shutdownNow 能够停止accept() 调用吗?因为 api 文档声明不保证成功。

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

最佳答案

您可以使用 close() 手动关闭连接(客户端/服务器端)方法或者您可以设置 timeout .

Set a timeout on blocking Socket operations:

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

The option must be set prior to entering a blocking operation to take effect. If the timeout expires and the operation would continue to block, java.io.InterruptedIOException is raised. The Socket is not closed in this case.

<小时/>

Is this the right way to stop such a server?

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

<小时/>

正如您所说的shutdownNow() API说:

There are no guarantees beyond best-effort attempts to stop processing actively executing tasks.

关于java - 如何正确停止serverSocket.accept(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com