我有一个Android代码,用于从TCP套接字发送和接收数据。它工作正常,但是,当插座突然关闭(例如,与Wi-Fi断开连接)时,我不会因读取和写入而出现任何错误。 在某些设备中,读取线程中会抛出异常,但在其他设备中(注4)不会抛出任何异常,并且应用程序无法检测到套接字是否已关闭。
写代码如下:
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(msg);
writer.flush();
}catch (IOException e){
e.printStackTrace();
}
读取线程:
try {
int bytesRead;
String print = new String();
print = "";
InputStream is = socket.getInputStream();
while (socket.isConnected()) {
bytesRead = is.read();
if (bytesRead != -1) {
print += (char) bytesRead;
if (bytesRead == ']') {
final String toprint = new String(print);
try{
((socketListener) Ui).onSocketListen(ip,toprint);
}catch(NullPointerException ex){
}
print = "";
}
} else {
socket.close();
socket = new Socket();
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
socket = new Socket();
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
答案 0 :(得分:1)
应用程序无法检测到套接字是否关闭
套接字未关闭。连接暂时中断,但TCP设计为能够存活。除非您有待处理的发送,否则您将无法检测到网络中断。
您可以使用Socket.setSoTimeout()
设置读取超时,当您捕获结果SocketTimeoutException
时,会以某种方式决定是否要再次尝试或放弃。