socket.isConnected()不检测断开连接的套接字

时间:2016-04-18 08:23:17

标签: java sockets

我有一个使用套接字连接到服务的Java应用程序。我一直希望从该套接字接收内容,如果它断开连接,我需要重新连接。当我以正常方式从远程应用程序端关闭/打开套接字时,重新连接正常工作。但是当远程应用程序被终止时,我的Java应用程序没有检测到它。我运行线程:

if (socket.isConnected()) { /* code */ }

此功能无法检测套接字何时被终止。为什么?如何检测远程套接字被杀?

注意:我必须使用java 1.4

UPD

我从socket输入流中读取逻辑:

 if (in.available()) {...}

这不会检测到套接字已断开连接。即使没有可用的数据来检测已关闭的套接字,我还应该使用in.read()吗?

2 个答案:

答案 0 :(得分:4)

isXXX()的各种Socket方法不会跟踪实际状态,但是对套接字做了什么。例如,isConnected()即使在套接字关闭后也会返回true,如果它已经在某个时候连接了。

检测Socket是否仍然有效的唯一方法是尝试使用它,即读取或写入它。如果抛出异常,则需要清理并重新连接。

答案 1 :(得分:1)

  

此功能无法检测套接字何时被终止。为什么呢?

这些函数只告诉您Socketobject的当前状态,它不会主动测试该行。 isConnected()表示我曾经联系过。

  

如何检测远程套接字被杀?

您需要使用适当的超时从连接中读取消息。如果连接已关闭或丢失,则最终会出现IOException,否则将达到超时。

BTW为了保存错误消息,我建议您在关闭之前发送一条消息,指示正常断开连接。通过这种方式,可以对记录期间的连接失败区别地处理优雅的断开连接。