java - 检查套接字是否仍然打开

标签 java sockets

我使用 Java Knock Knock 教程来创建客户端-服务器连接,但我不知道如何检查套接字是否仍然打开。

简化代码:

try {
    while ((clientMessage = inFromClient.readLine()) != null) {
        //do stuff
    } catch (IOException e) {
        //client disconnected
        e.printStackTrace();
    }
}

这很好用,但是我注意到,当客户端基于 Linux 时,如果客户端被强制关闭,则不会抛出异常。我尝试了其他人发布的一些建议,但无法发挥任何作用。我尝试实现一个循环来检查自收到最后一条消息以来已经过去了多长时间,但它不起作用,该循环必须位于上面代码中的循环内部,并且仅当从 接收到新消息时才执行该循环客户端。我很困惑,但我不明白如何实现任何检查方法。

如果我将方法放在上述循环之外检查不活动状态,那么它永远不会被调用,因为套接字循环是不确定的(除非套接字已关闭)。

最佳答案

只需使用Socket.setSoTimeout()设置读取超时。将其设置为高于预期的请求间隔,例如两倍。如果过期,您将收到SocketTimeoutException:关闭套接字。

与某些注释相反,isConnected()isBound()isClosed()、 等对此没有用。它们告诉您是否连接、绑定(bind)、关闭了Socket。而不是连接的状态。

关于java - 检查套接字是否仍然打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167985/

相关文章:

java - 我可以在 spring mvc 应用程序中池化 Controller 吗?如果可以的话,它将如何影响性能?

java - 何时在 java 中使用 get/set 方法

c - accept() 一直返回 0

c# - 使用套接字传输二进制数据?

java socket编程对话

java - 在 DB2 上使用其他模式的 Hibernate 多对一

java - 当其他类出现编译问题时,如何在IntelliJ IDEA中运行测试?

reactjs - 在 useEffect 之外访问我的套接字变量

java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 101

java - 无法连接到 SMTP 主机 : outlook. office365.com,端口 : 587; nested exception is: java.net.SocketException:权限被拒绝:连接