Java serversocket未检测到连接丢失
我在wifi网络上有一个套接字客户端(安卓手机上)和服务器(PC上),服务器成功地从客户端读取数据 然而,当我关闭手机上的wifi时,服务器读取的数据就挂起了,而我希望会抛出一些错误 我在服务器上设置了setSoTimeout,但读取没有超时 在PC上,netstat仍显示已建立的连接 netstat-na|grep 6668 TCP 192.168.43.202:6668 192.168.43.26:43076已建立 有没有办法判断客户端主机是否已消失,或者读取是否超时 这是服务器读取Java serversocket未检测到连接丢失,java,android,sockets,networking,serversocket,Java,Android,Sockets,Networking,Serversocket,我在wifi网络上有一个套接字客户端(安卓手机上)和服务器(PC上),服务器成功地从客户端读取数据 然而,当我关闭手机上的wifi时,服务器读取的数据就挂起了,而我希望会抛出一些错误 我在服务器上设置了setSoTimeout,但读取没有超时 在PC上,netstat仍显示已建立的连接 netstat-na|grep 6668 TCP 192.168.43.202:6668 192.168.43.26:43076已建立 有没有办法判断客户端主机是否已消失,或者读取是否超时 这是服务器读取 if
if (ss.isConnected()) {
try {
readData();
} catch (java.net.SocketTimeoutException ex) {
logger.warning(ex.toString());
} catch (InterruptedIOException ex) {
logger.warning(ex.toString());
} catch (IOException ex) {
logger.log(Level.WARNING, "Data communication lost will close streams - IOEx - socket status {0}", ss.socketStatus());
closeStreams();
} catch (Exception ex) {
logger.log(Level.WARNING, "Data communication lost will close streams - Ex - socket status {0}", ss.socketStatus());
closeStreams();
}
}
在readData所在的位置
public void readData() throws IOException {
for (int i = 0; i < data.length; i++) {
data[i] = ss.readDouble();
}
}
以及服务器连接
public void connect() throws IOException {
if (serverSocket == null || serverSocket.isClosed()) {
init();
}
logger.log(Level.INFO, "Wait on " + serverSocket.getLocalPort());
server = serverSocket.accept();
serverSocket.close();
logger.log(Level.INFO, "Connected to {0}", server.getRemoteSocketAddress());
out = new DataOutputStream(server.getOutputStream());
in = new DataInputStream(server.getInputStream());
}
这是TCP连接的本质,而不是java套接字本身。如果远程对等方断开了连接,您的服务器如何知道该对等方根本没有要发送的数据 在关闭的套接字上写入将导致异常,如果客户端由于上述原因未正确结束tcp连接,则读取将简单地阻塞 若您通过socket API,您将找到设置超时的选项(在继续执行阻塞操作之前)
您也可以考虑TCP保持生存,这也被套接字API暴露。
//编辑:根据OP注释的附加信息 当您的客户机连接到服务器时,您将创建一个客户机套接字来和对等方通信。您正在侦听新客户端连接的服务器套接字。它是指定keep alive或read timeout的客户机套接字,因为这是用于读/写的套接字// your server is actually reference to ClientSocket
server = serverSocket.accept();
// keep alive duh
server.setKeepAlive(true);
serverSocket.close();
设置一个超时,假设10分钟内没有发送数据,在60秒内关闭它
这个问题的答案可能会对您有所帮助。正如文章中提到的,我确实设置了一个SoTimeout值,但读取没有超时。好的,我看到这个链接有一种不同的设置超时的方法。看看,可能会有帮助!我刚刚测试了它,效果很好。正如在文章中提到的,我确实设置了一个SoTimeout值,但是读取没有超时。另外,“保持活动”设置是针对客户端而不是服务器的。错误,您在这两条语句上都错了。Keep alive是服务器也使用的机制,从上面的代码中,您也没有设置读取超时。我将添加编辑来回答这个问题,以便为您澄清这一点。啊,是的,我正在查看ServerSocket类。谢谢,我试试看。为什么每次接受连接时都要关闭服务器套接字?不要那样做。
// your server is actually reference to ClientSocket
server = serverSocket.accept();
// keep alive duh
server.setKeepAlive(true);
serverSocket.close();