Java serversocket未检测到丢失的连接

时间:2015-05-20 13:56:35

标签: java android sockets networking serversocket

我在wifi网络上都有套接字客户端(在Android手机上)和服务器(在PC上),服务器成功从客户端读取数据。

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

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

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

  

netstat -na | grep 6668

     

TCP 192.168.43.202:6668 192.168.43.26:43076 ESTABLISHED

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

这是服务器读取

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

ss.readDouble()是,

public double readDouble() throws IOException {
    return in.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());
}

2 个答案:

答案 0 :(得分:0)

这是TCP连接的本质,而不是java套接字本身。如果远程对等方断开连接断开连接,那么您的服务器应该如何知道对等方没有数据要发送?

写入封闭的套接字会导致异常,如果客户端没有正确地结束tcp连接,读取将只是阻塞,原因如上。

如果您通过套接字API,您将找到设置超时的选项(在继续阻止操作之前)。

您还可以考虑TCP KEEP Alive,它也是由Socket API公开的。

//编辑:根据OP评论的附加信息

当您的客户端连接到服务器时,您创建一个客户端套接字以与对等方通信。您的服务器套接字是您正在侦听新客户端连接的套接字。它是您指定保持活动或读取超时的客户端套接字,因为这是您从中读取/写入的套接字。

// your server is actually reference to ClientSocket
 server = serverSocket.accept();

// keep alive duh
    server.setKeepAlive(true);

serverSocket.close();

答案 1 :(得分:0)

暂停,所以让我们说10分钟没有发送数据,60秒后关闭!

Setting a timeout for socket operations

这个问题的答案可能对你有帮助。