我在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());
}
答案 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)