我正在研究一种Java听觉传感器,它只是告诉你对方是否死了。我找到了some code like so:
isConnected = kkSocket.isConnected() &&
!kkSocket.isClosed() &&
InetAddress.getByName(serverAddress).isReachable(1000);
这是一种可靠的方法吗?我对这条线感到困惑:
InetAddress.getByName(serverAddress).isReachable(1000);
那是什么 - 如果我正在测试“localhost”(即不是真正的网络示例,只有一台机器),它会起作用吗?感谢
答案 0 :(得分:2)
根本没有任何用处。 isConnected()
方法告诉您是否曾通过connect()
调用accept()
(隐式或显式)或接收套接字; isClosed()
方法告诉您是否曾致电close()
; isReachable()
方法只会告诉您主机是否可以访问,并且这样做的代价是每次成功调用时额外的TCP连接设置和拆除。
无它与连接状态有任何关系。检测TCP连接错误的唯一可靠方法是尝试写入它。
答案 1 :(得分:2)
这取决于你的意思是“如果对方死了”。
首先,isConnected()
调用没用。这简单地询问Socket是否在过去的某个时刻连接了。周期。
其次,isClosed()
电话无效。
第三,isReachable()
电话没什么用处。它确实为您提供了一定程度的保证,即服务主机在基本网络级别上是活动且可访问的。 (具体来说,它告诉您ICMP Ping数据包正在到达主机,并且响应正在返回。)但是,这并不会告诉您与服务的TCP / IP连接是否处于活动状态,或者服务本身是否存在仍然运作正常。实际上,主机可以响应Ping数据包,拒绝或忽略尝试连接服务。
事实上,确保服务真正存在(在有用意义上)的唯一方法是尝试使用它。这意味着什么将取决于服务的性质。对于典型的同步服务,您可以向套接字输出流写入请求“消息”,然后尝试从输入流中读取回复“消息”。 (你应该确保在阅读写作时使用超时...):
如果上述情况均未发生,则表明您的服务处于“活动状态”,但可能仅对您发送的请求类型“存活”。
显然,您还需要检查响应是否符合预期。例如,为每个请求发送501或503响应的HTTP服务在有用的意义上不存在。
如果我正在测试“localhost”(即不是真正的网络示例,只有一台机器),那么
isReachable
会工作吗?
我认为没有明确的答案。这取决于操作系统是否支持环回网络地址上的ICMP协议。我不会期望它工作,因为AFAIK在环回时没有真正的ICMP用例。