gpt4 book ai didi

java - 确保套接字连接,无需控制底层协议(protocol)

转载 作者:行者123 更新时间:2023-12-02 01:20:43 26 4
gpt4 key购买 nike

我有一个java应用程序,它管理与设备的多个套接字连接。我无法控制这些设备实现的协议(protocol),现在我希望我的 java 应用程序为每个设备发送心跳。设备不发送数据,仅响应命令。

InputStream.read() 的 javadoc声明如果到达流末尾,它将返回-1。因此,这似乎是检查连接是否打开的合理方法。但是当我实现这个解决方案时,没有可用的字节(因为设备只响应命令),并且由于连接是打开的,它将永远卡在读取调用处。例如,我查看一个字节,如果该字节为 -1,则心跳将“不健康”:

public static void main(final String[] args) throws IOException {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress("192.168.30.99", 25901), 1000);
System.out.println("Connected");

final BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
bis.mark(1);
System.out.println(bis.read()); // Stalls forever here
bis.reset();
System.out.println("Done");
}
}

如果在 x 毫秒内没有收到字节,则设备已连接,这样说是否合理?

在 ip 端口很重要的情况下,有没有可靠的方法可以在没有心跳的情况下检查套接字连接?

最佳答案

Is there any surefire way to check socket connectivity without heartbeats where the ip and port is important?

不,除非您尝试与其通信,否则您无法可靠地知道另一端是否还活着。

如果另一端没有无操作 ping 功能,那么您就运气不好了。如果连接被切断,在阻塞 read() 调用中等待不会有任何帮助。

Is it reasonable to say that, if no byte is received within x milliseconds, the device is connected?

没有。这意味着设备在 x 毫秒内没有发送任何内容。这是正常的,因为它只响应命令。

关于java - 确保套接字连接,无需控制底层协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771782/

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