无法检测到套接字是否已断开连接

时间:2017-08-02 08:36:29

标签: java android sockets

嗨,这是我通过套接字将数据发送到连接到网络的另一台设备的代码

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()始终返回falseIOException永远不会发生。断开插座我正在关闭设备并尝试再次发送数据。即使从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的重复,因为我做了那里提到的所有事情

2 个答案:

答案 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
}