如何从客户端检测网络断开(JAVA)
我已经编写了java客户机-服务器套接字连接代码。在这种情况下,服务器接受客户机连接,然后服务器使用PrintStream发送数据,客户机读取readline()中的数据。在此之后,客户端将在readline中等待服务器。如果出现网络断开连接,客户端将一直在readline中等待,并且永远不会退出readline。有没有办法检测到客户端本身的断开连接?或者我是否必须编写新的心跳线程来检查网络断开?打开套接字选项,以便在套接字上保持活动状态。这将启用TCP协议中内置的心跳功能 这里有一个简单的方法来打开它如何从客户端检测网络断开(JAVA),java,sockets,Java,Sockets,我已经编写了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()
的结果与服务器无关。它马上就回来了。你只是在编造。请阅读以下内容:查看我对你问题的评论:-该副本在答案中提供了更多选项和解释。