你如何处理 Java 中的套接字断开连接?[复制]

IT小君   2021-12-09T03:41:16

大家好。我有一个使用 ServerSocket 和 Socket 类用 Java 编写的服务器。

我希望能够检测和处理断开连接,然后在必要时重新连接新客户端。

检测客户端断开连接、关闭套接字然后接受新客户端的正确程序是什么?

点击广告,支持我们为你提供更好的服务
评论(3)
IT小君

据推测,您正在从套接字读取,可能在输入流上使用包装器,例如 BufferedReader。在这种情况下,您可以在相应的读取操作返回 -1(对于原始 read() 调用)或 null(对于 readLine() 调用)时检测流结束。

某些操作在关闭的套接字上执行时会导致 SocketException,您也需要适当处理。

2021-12-09T03:41:23   回复
IT小君

检测另一端已消失的唯一安全方法是定期发送心跳并让另一端根据缺少心跳而超时。

2021-12-09T03:41:23   回复
IT小君

是不是只有我,或者没有人注意到 JavaDoc 在ServerSocket api下声明了一个方法,它允许我们根据 serversocket 的关闭状态获取布尔值?

您可以每隔几秒钟循环一次以检查它的状态:

if(!serverSocket.isClosed()){
  // whatever you want to do if the serverSocket is connected
}else{
  // treat a disconnected serverSocket
}

编辑:再次阅读您的问题,似乎您需要服务器不断搜索连接,如果客户端断开连接,它应该能够重新检测客户端何时尝试重新连接。这不应该只是你的解决方案吗?

有一个正在监听的服务器,一旦它接收到一个客户端连接,它应该将它传递给一个工作线程对象并启动它以异步操作。然后服务器可以循环回侦听新连接。如果客户端断开连接,启动的线程应该死,当它重新连接时,会再次启动一个新线程来处理新连接。

Jenkov提供了这个实现的一个很好的例子。

2021-12-09T03:41:24   回复