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

标签 java android sockets telnet

我正在制作一个使用 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/

相关文章:

java - 在 Spring Data JPA 中使用 @Transactional 注解的层

java - 以有效的方式循环遍历 ResultSet 并将列值添加到 List<String>

sockets - 是否有一个围绕winsock内核的套接字包装器(WSK,而不是winsock2)?

java - 不同类型的多个列表的生成排列

java - WebView不断爆发

android - Android:播放PCM文件时出错

android - Bing Maps Android SDK 中的多边形信息框

java - 桌面 TCP 流式传输 (java)

java - 如何加快 Java DatagramSocket 的性能?

java - Javax.sound对音频线路的直接控制