Press "Enter" to skip to content

Java如何判断socket连接是否已经断开(Java socket API: How to tell if a connection has been closed?)

没有任何TCP API可以告诉您当前的连接状态。 isConnected()和isClosed()是告诉你套接字的当前状态。 和连接状态不是一样的东西。

  • isConnected()告诉你是否已连接此套接字。 你已经链接了因此它返回true。
  • isClosed()告诉你是否已关闭此套接字。 除非有,否则它返回false。
  • 如果对方(peer)有序地关闭了连接

read()返回-1
readLine()返回null
readXXX()会为其他任何XXX抛出EOFException。

写入将引发IOException:“connection reset by peer”,这会受到缓冲延迟的影响。

  • 如果由于任何其他原因导致连接断开,则写操作最终将引发IOException,如上所述,读操作也可能会引发相同的异常。
  • 如果对方(peer)仍处于连接状态但未使用连接,则可以使用读取超时异常来判断。
  • 与您可能在其他地方读到的内容相反,ClosedChannelException不会告诉你链接异常(SocketException: socket closed. 也不会),它仅告诉你已关闭通道,然后你还继续使用它。 换句话说,你的程序代码可能有错误,你关闭了链接,还继续使用它,它并不表示连接异常。
  • 在Windows XP上使用Java 7进行了一些实验,可能还会有如下现象:

你selecting on OP_READ
select() 返回大于零的值
关联的SelectionKey已经无效(key.isValid()== false)


这意味着对等方已重置连接。 但是,这可能是JRE版本或平台所特有的

参考资料:

https://stackoverflow.com/questions/10240694/java-socket-api-how-to-tell-if-a-connection-has-been-closed/10241044#10241044

https://stackoverflow.com/questions/34112730/java-socket-handling-clients-disconnecting

One Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注