我正在制作一个使用 Apache 的 TelnetClient
打开 telnet 连接的 Android 应用程序.为此,我创建了一个 Runnable
,它将永远在 processInput()
中读取。我检查 isConnected()
套接字是否仍然连接,如果没有,我从 runnable 返回并在监听器上调用 onDisconnected()
。但是,即使我关闭 Wi-Fi,也不会调用最后一个方法。
我可以检查 Wi-Fi 状态,但无法捕捉到服务器挂起或连接因其他原因丢失的情况。如何检测连接何时关闭?
private class ClientThread implements Runnable {
@Override
public void run() {
while (true) {
if (!client.isConnected()) {
for (NewRecordListener listener : listeners)
listener.onDisconnected();
try { client.disconnect(); } catch (IOException e) {}
return;
}
try {
processInput();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
最佳答案
“如果套接字仍处于连接状态,我会使用 isConnected() 检查”
你不能:
"Returns: true if the socket successfuly connected to a server"
并不一定意味着一旦连接中断就会为 false。
“如何检测连接何时关闭”
- 在非正常连接中止时,大多数情况下只有在尝试写入时才有机会获得 IOException。
- 您可能想使用:AreYouThere定期。
旁注:
我很想说这个doc :
Returns true if the client is currently connected to a server.
完全错误。 Java 6 的文档 Socket.isConnected此方法委托(delegate)给的对象并没有这样说:
Returns: true if the socket successfuly connected to a server
isConnected 的 Java TCP Socket 实现的典型行为是当 Socket 已成功连接时它们返回 true - 并继续这样做。
另见 https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html#isConnected-- :
Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket ... "
不过那是针对 Java 8 的。我不知道他们是刚刚添加了那个注释还是行为发生了变化,但我怀疑是第一个。
关于java - 如何检测 Android 上 Apache SocketClient 中的连接丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41850378/