这是检查套接字是否在Java中死亡的好方法吗?

时间:2013-03-19 01:50:52

标签: java sockets networking

我正在研究一种Java听觉传感器,它只是告诉你对方是否死了。我找到了some code like so

        isConnected = kkSocket.isConnected() &&
                      !kkSocket.isClosed() &&
                      InetAddress.getByName(serverAddress).isReachable(1000);

这是一种可靠的方法吗?我对这条线感到困惑:

InetAddress.getByName(serverAddress).isReachable(1000);

那是什么 - 如果我正在测试“localhost”(即不是真正的网络示例,只有一台机器),它会起作用吗?感谢

2 个答案:

答案 0 :(得分:2)

根本没有任何用处。 isConnected()方法告诉您是否曾通过connect()调用accept()(隐式或显式)或接收套接字; isClosed()方法告诉您是否曾致电close(); isReachable()方法只会告诉您主机是否可以访问,并且这样做的代价是每次成功调用时额外的TCP连接设置和拆除。

它与连接状态有任何关系。检测TCP连接错误的唯一可靠方法是尝试写入它。

答案 1 :(得分:2)

这取决于你的意思是“如果对方死了”。

首先,isConnected()调用没用。这简单地询问Socket是否在过去的某个时刻连接了。周期。

其次,isClosed()电话无效。

第三,isReachable()电话没什么用处。它确实为您提供了一定程度的保证,即服务主机在基本网络级别上是活动且可访问的。 (具体来说,它告诉您ICMP Ping数据包正在到达主机,并且响应正在返回。)但是,这并不会告诉您与服务的TCP / IP连接是否处于活动状态,或者服务本身是否存在仍然运作正常。实际上,主机可以响应Ping数据包,拒绝或忽略尝试连接服务。

事实上,确保服务真正存在(在有用意义上)的唯一方法是尝试使用它。这意味着什么将取决于服务的性质。对于典型的同步服务,您可以向套接字输出流写入请求“消息”,然后尝试从输入流中读取回复“消息”。 (你应该确保在阅读写作时使用超时...):

  • 如果服务已终止或TCP / IP连接已断开,则应获取SocketException或类似内容。 (但请注意,TCP / IP连接断开并不一定意味着该服务不存在。您可能只需要再次连接。)
  • 如果服务“卡住”,您可能会在写入或读取时超时。
  • 如果存在网络问题,您可能会超时,或者您可能会收到某种SocketException。

如果上述情况均未发生,则表明您的服务处于“活动状态”,但可能仅对您发送的请求类型“存活”。

显然,您还需要检查响应是否符合预期。例如,为每个请求发送501或503响应的HTTP服务在有用的意义上不存在。


  

如果我正在测试“localhost”(即不是真正的网络示例,只有一台机器),那么isReachable会工作吗?

我认为没有明确的答案。这取决于操作系统是否支持环回网络地址上的ICMP协议。我不会期望它工作,因为AFAIK在环回时没有真正的ICMP用例。