没有任何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/34112730/java-socket-handling-clients-disconnecting
博主继续更新