【发布时间】:2015-05-21 02:25:38
【问题描述】:
我在 wifi 网络上有一个套接字客户端(在 android 手机上)和服务器(在 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();
}
}
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());
}
【问题讨论】:
-
为什么每次接受连接时都关闭服务器套接字?不要那样做。
标签: java android sockets networking serversocket