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

时间:2011-08-09 00:41:34

标签: java sockets exception tcp disconnect

作者:

   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)跑出来,第四个写()将抛出。

2 个答案:

答案 0 :(得分:5)

  

它是否应该在第一次尝试写死者时抛出   连接?

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

答案 1 :(得分:0)

根据文档,读者应该在read()操作中返回-1,但我没有得到任何东西,因为一些XmlPullparser正在阻碍

parser.setInput(connection.reader);

因此,编写器表现为上面描述的EJP,但是如果您可以访问源代码,那么我们可以将connection.reader实例化为某些InputStreamReaderEx,如下所示:

/ **  * @author kellogs  *  * / public class InputStreamReaderEx扩展InputStreamReader {

/* (non-Javadoc)
 * @see java.io.BufferedReader#read()
 */
@Override
public int read() throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read();

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

/* (non-Javadoc)
 * @see java.io.BufferedReader#read(char[], int, int)
 */
@Override
public int read(char[] buffer, int offset, int length) throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read(buffer, offset, length);

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

}

并在其他同伴离开时收到通知