gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:18:17 25 4
gpt4 key购买 nike

我正在研究 Java 心跳传感器,它只会告诉您对方是否死亡。我找到了 some code like so :

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

这种方法靠谱吗?我对这条线感到困惑:

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

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

最佳答案

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

首先,isConnected() 调用没有用。这只是询问 Socket 是否在过去的某个时间点连接过。期间。

其次,isClosed() 调用没有用。

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

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

  • 如果服务终止或 TCP/IP 连接中断,您应该得到 SocketException 或类似的异常。 (但请注意,断开的 TCP/IP 连接并不一定意味着该服务不可用。您可能只需要重新连接即可。)
  • 如果服务“卡住”,您可能会在写入或读取时超时。
  • 如果存在网络问题,您可能会遇到超时或某种类型的 SocketException。

如果上述情况均未发生,则表明您的服务“有效”,尽管它可能仅针对您发送的请求类型“有效”。

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


What's that for - would isReachable work if I'm testing on "localhost" (ie not a real networked example, just one machine)?

我认为对此没有明确的答案。这将取决于操作系统是否支持环回网络地址上的 ICMP 协议(protocol)。我不会期望它起作用,因为据我所知,环回上没有 ICMP 的实际用例。

关于java - 这是检查套接字是否在 Java 中死亡的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com