我有一个使用套接字连接到服务的Java应用程序。我一直希望从该套接字接收内容,如果它断开连接,我需要重新连接。当我以正常方式从远程应用程序端关闭/打开套接字时,重新连接正常工作。但是当远程应用程序被终止时,我的Java应用程序没有检测到它。我运行线程:
if (socket.isConnected()) { /* code */ }
此功能无法检测套接字何时被终止。为什么?如何检测远程套接字被杀?
注意:我必须使用java 1.4
UPD
我从socket输入流中读取逻辑:
if (in.available()) {...}
这不会检测到套接字已断开连接。即使没有可用的数据来检测已关闭的套接字,我还应该使用in.read()
吗?
答案 0 :(得分:4)
isXXX()
的各种Socket
方法不会跟踪实际状态,但是对套接字做了什么。例如,isConnected()
即使在套接字关闭后也会返回true,如果它已经在某个时候连接了。
检测Socket
是否仍然有效的唯一方法是尝试使用它,即读取或写入它。如果抛出异常,则需要清理并重新连接。
答案 1 :(得分:1)
此功能无法检测套接字何时被终止。为什么呢?
这些函数只告诉您Socketobject的当前状态,它不会主动测试该行。 isConnected()
表示我曾经联系过。
如何检测远程套接字被杀?
您需要使用适当的超时从连接中读取消息。如果连接已关闭或丢失,则最终会出现IOException,否则将达到超时。
BTW为了保存错误消息,我建议您在关闭之前发送一条消息,指示正常断开连接。通过这种方式,可以对记录期间的连接失败区别地处理优雅的断开连接。