嗨,这是我通过套接字将数据发送到连接到网络的另一台设备的代码
try {
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
printWriter.print(data);
Log.d("error", printWriter.checkError() + "");
printWriter.flush();
} catch (IOException e) {
Log.d("socket","is disconnected");
e.printStackTrace();
}
问题是printWriter.checkError()
始终返回false
而IOException
永远不会发生。断开插座我正在关闭设备并尝试再次发送数据。即使从InputStream
阅读也无济于事
private class SocketHandler extends AsyncTask<Void, byte[], Void> {
InputStream in;
@Override
protected void onPreExecute() {
try {
in = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
byte[] content = new byte[2048];
if (in != null) {
while (true) {
try {
if (in.available() > 0) {
int n = in.read(content);
if (n == -1) {
break;
}
publishProgress(new byte[][]{Arrays.copyOfRange(content, 0, n)});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onProgressUpdate(byte[]... values) {
String data = new String(values[0]);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
Log.d("socket", "is disconnected");
}
}
read
永远不会返回-1
,因此我可以检测到套接字已断开连接。我该怎么办?
编辑:它不是JAVA : Handling socket disconnection的重复,因为我做了那里提到的所有事情
答案 0 :(得分:0)
if (in.available() > 0) {
除非有可以无阻塞地阅读数据,否则永远不会致电read()
。
int n = in.read(content);
if (n == -1) {
break;
不可达。
}
如果available()
为零,那么除了无意识地抽吸CPU之外什么都不做。
治愈:删除available()
测试。它没有做任何有用的事情,它阻止你检测流的结束。
答案 1 :(得分:0)
我遇到了同样的问题。我使用计时器在两侧每秒发送连接检查命令,在那个计时器中,我检查了上次收到此连接检查命令的时间,如果它已结束,例如10秒,然后我决定套接字断开
tOut = new Timer();
tOut.schedule(new TimerTask() {
@Override
public void run() {
long dif = System.currentTimeMillis() - lastCCReceivedTime;
if (dif > 1000 * 10) {
// socket is disconnected
return;
}
try {
out.println("Connection check");
} catch (Exception e) {
if (out != null)
out.close();
// socket is disconnected
}
}
}, 1000, 1000);
保存上次收到命令
while ((msg = in.readLine()) != null) {
lastCCReceivedTime = System.currentTimeMillis();
//Message received
}