Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 serversocket未检测到连接丢失_Java_Android_Sockets_Networking_Serversocket - Fatal编程技术网

Java serversocket未检测到连接丢失

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

我在wifi网络上有一个套接字客户端(安卓手机上)和服务器(PC上),服务器成功地从客户端读取数据

然而,当我关闭手机上的wifi时,服务器读取的数据就挂起了,而我希望会抛出一些错误

我在服务器上设置了setSoTimeout,但读取没有超时

在PC上,netstat仍显示已建立的连接

netstat-na|grep 6668

TCP 192.168.43.202:6668 192.168.43.26:43076已建立

有没有办法判断客户端主机是否已消失,或者读取是否超时

这是服务器读取

 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();