我制作的Android应用程序使用Apache的TelnetClient
打开telnet连接。为此,我创建了一个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();
}
}
}
}
答案 0 :(得分:1)
"如果套接字仍然连接,我用isConnected()检查"
你不能:
"返回:如果套接字成功连接到服务器,则返回true"
并不一定意味着一旦连接断开就会出现错误。
"如何检测连接何时关闭"
旁注:
我很想说这个doc:
如果客户端当前已连接到服务器,则返回true。
是完全错误的。此方法委派给的Java 6 Socket.isConnected的文档并未说明:
返回: 如果套接字成功连接到服务器,则为true
isConnected的Java TCP Socket实现的典型行为是,当Socket成功连接时它们返回true - 并继续这样做。
另见https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html#isConnected--:
但是,对于Java 8来说,这是一个很好的例子。我不知道他们是刚刚添加了Note还是行为发生了变化,但我怀疑是第一次。注意:关闭套接字并不清除其连接状态,这意味着对于已关闭的套接字,此方法将返回true ..."