Socket.read()不返回任何内容,并且在Android中关闭时不会抛出异常

时间:2015-12-04 12:16:21

标签: java android sockets exception-handling tcpclient

我有一个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();
}

1 个答案:

答案 0 :(得分:1)

  

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

套接字关闭。连接暂时中断,但TCP设计为能够存活。除非您有待处理的发送,否则您将无法检测到网络中断。

您可以使用Socket.setSoTimeout()设置读取超时,当您捕获结果SocketTimeoutException时,会以某种方式决定是否要再次尝试或放弃。