【问题标题】:Socket.read() return nothing and doesn't throw exception when closed in AndroidSocket.read() 在 Android 中关闭时不返回任何内容并且不抛出异常
【发布时间】:2016-03-09 09:06:16
【问题描述】:

我有一个从 TCP 套接字发送和接收数据的 Android 代码。它工作正常,但是,当套接字突然关闭时(例如从 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();
}

【问题讨论】:

    标签: java android sockets exception-handling tcpclient


    【解决方案1】:

    应用无法检测到套接字是否关闭

    套接字没有关闭。连接被暂时中断,但 TCP 旨在承受这种情况。除非您有待处理的发送,否则您不会检测到网络中断。

    您可以使用Socket.setSoTimeout() 设置读取超时,当您收到SocketTimeoutException 的结果时,以某种方式决定您是要重试还是放弃。

    【讨论】:

    • 关于挂起的发送,即使我在中断期间尝试发送数据,write函数也不会抛出异常。关于'Socket,setSoTimeout()',我试过了,但是'read()'函数在'SocketTimeoutException'之后一直没有检测到中断,所以我想我需要在服务器端实现某种心跳,对吗?
    • 无法检测到中断。你所拥有的只是它超时的事实。你必须决定这意味着什么。重新写入,失败不是立即的:TCP 必须超时重试。可能需要多次发送。您可以使用心跳,但我从未使用过,例如RMI 和 CORBA 也没有,HttpURLConnection 也没有,所以没有必要。
    猜你喜欢
    • 2014-11-14
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多