Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从客户端检测网络断开(JAVA)_Java_Sockets - Fatal编程技术网

如何从客户端检测网络断开(JAVA)

如何从客户端检测网络断开(JAVA),java,sockets,Java,Sockets,我已经编写了java客户机-服务器套接字连接代码。在这种情况下,服务器接受客户机连接,然后服务器使用PrintStream发送数据,客户机读取readline()中的数据。在此之后,客户端将在readline中等待服务器。如果出现网络断开连接,客户端将一直在readline中等待,并且永远不会退出readline。有没有办法检测到客户端本身的断开连接?或者我是否必须编写新的心跳线程来检查网络断开?打开套接字选项,以便在套接字上保持活动状态。这将启用TCP协议中内置的心跳功能 这里有一个简单的方法

我已经编写了java客户机-服务器套接字连接代码。在这种情况下,服务器接受客户机连接,然后服务器使用PrintStream发送数据,客户机读取readline()中的数据。在此之后,客户端将在readline中等待服务器。如果出现网络断开连接,客户端将一直在readline中等待,并且永远不会退出readline。有没有办法检测到客户端本身的断开连接?或者我是否必须编写新的心跳线程来检查网络断开?

打开套接字选项,以便在套接字上保持活动状态。这将启用TCP协议中内置的心跳功能

这里有一个简单的方法来打开它

Socket socket = ...; // Your socket on the client side
socket.setKeepAlive(true);
如果连接的另一端停止响应心跳,您将在调用时收到一个
IOException
,以从套接字读取数据

但是,此操作的超时时间为2小时。这可能太长,无法满足您的需要(您没有指定)

断开与客户端的连接:
  • clientSocket.isConnected()
    :这是错误的,它不会返回true,并且会一直返回false,直到服务器也断开连接
  • 您可以尝试通过输出流发送数据,您将得到异常,特别是
    IOException(断管)
  • 您还可以使用
    socket.keepAlive(true)
    这将使用内置于socket中的heartbeat功能,您将因此得到一个异常

  • 干杯。

    (1)不正确。此API不会神奇地检测断开连接并返回false。(2) 是正确的。您必须使用另一个线程并不断检查
    false
    返回值。否
    isConnected()
    在您关闭套接字之前不会返回false。使用其他线程无法改变这一点。你仍然错了。在客户端调用
    isConnected()
    的结果与服务器无关。它马上就回来了。你只是在编造。请阅读以下内容:查看我对你问题的评论:-该副本在答案中提供了更多选项和解释。