gpt4 book ai didi

java - 计算机唤醒后如何识别 MacOS 上断开的 Java 套接字连接

转载 作者:行者123 更新时间:2023-11-29 09:27:55 28 4
gpt4 key购买 nike

我有一个 Java 客户端,它应该持续连接到某个 Java 服务器,并且只输出服务器发送的任何内容(请参阅下面的摘录)。

问题是,如果客户端计算机 (MacOS X) 进入 hibernate 状态然后再次唤醒,客户端会在 in.readLine() 处挂起并且不会意识到连接已断开。我向套接字添加了一个 SO_TIMEOUT,这样客户端就可以停止阻塞 readLine(),它确实会抛出一个 SocketTimeoutException,但随后很高兴尝试再次从断开的连接中读取一行。

我的问题是:为什么 in.readLine() 不会因 IOException 而失败(以便我可以重新启动连接)以及我如何才能让客户端在 Mac OS X 上以 awake->sleep->awake 周期重新连接到服务器?

Socket socket = new Socket(...);
socket.setSoTimeout(10000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
[...]
while (true) {
try {
while ((serverSays = in.readLine()) != null) {
System.out.println("Server says: " + serverSays);
}
} catch (SocketTimeoutException e) {
continue;
}
// An exception other than SocketTimeoutException will break the while-loop.
}
// If another exception other than SocketTimeoutException occurs,
// catch it and re-initiate the connection and start over.

最佳答案

IOException 表示本地主机知道远程主机不再提供数据。

SocketTimeoutException 表示远程主机未能在分配的时间内提供数据。它从未告诉我们连接已正式断开。

SocketTimeoutException 在连接未正常关闭时发生。如果远程主机电源耗尽,或者有人将以太网电缆从中拔出,这就是您得到的结果。

在这种情况下,当你在 sleep 时,远程主机一定决定关闭连接,但你的主机错过了通知,因为他正在 sleep 。

解决方案是假设连接在一定数量的超时后断开。

关于java - 计算机唤醒后如何识别 MacOS 上断开的 Java 套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43375572/

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