如何在Android上的Apache SocketClient中检测连接丢失?

时间:2017-01-25 11:24:04

标签: java android sockets telnet

我制作的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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

"如果套接字仍然连接,我用isConnected()检查"

你不能:

  

"返回:如果套接字成功连接到服务器,则返回true"

并不一定意味着一旦连接断开就会出现错误。

"如何检测连接何时关闭"

  • 在非正常连接中止时,大多数情况下只有在尝试写入时才有机会获得IOException。
  • 您可能需要定期使用:AreYouThere

旁注:

我很想说这个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--

  

注意:关闭套接字并不清除其连接状态,这意味着对于已关闭的套接字,此方法将返回true ..."

但是,对于Java 8来说,这是一个很好的例子。我不知道他们是刚刚添加了Note还是行为发生了变化,但我怀疑是第一次。