java – 通过断开连接的套接字写入不会抛出

作家:

   socket.setSendBufferSize(1);
   socket.setTcpNoDelay(true);
   writer = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

用法如下:

try {
        writer.write(packet.toXML());
        writer.flush();
        ...
    }
    catch (Exception ioe){
        if (!done) {
            done = true;
            ... 
        }       
    }

这是客户端代码.当它的服务器断开套接字(也是java代码)时,客户端如何才会在5-10分钟后抛出?它是否应该在第一次尝试写入死连接时抛出?

谢谢

编辑:

关闭服务器后,这里是TCP状态:

tcp        0      0 server:443     client:50283   FIN_WAIT2 

tcp4       0      0  cient.50283     server.443       CLOSE_WAIT

EDIT2:

客户端是一个Android应用程序.从电话中跑出来,写入的第二个数据包导致抛出.从模拟器(下面的Mac)跑出第四个write()将抛出.

解决方法:

Should it not throw at the first attempt to write over the dead
connection ?

不,它只知道收到了一个FIN,它可能只是一个peerOutput(),它可能仍在读取.所以TCP必须发送数据.如果对等体已关闭,它将发出RST,TCP将在后续写入时提供给应用程序.

上一篇:python – Redis定期断开并重新连接Twisted


下一篇:PHP根本没有检测到连接中止