5

笔者:

   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

编辑2:

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

4

2 回答 2

5

它不应该在第一次尝试覆盖死连接时抛出吗?

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

于 2011-08-09T02:01:06.937 回答
0

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

parser.setInput(connection.reader);

因此,编写器的行为类似于上述 EJP,但如果您可以访问源代码,那么我们可以将 connection.reader 实例化为一些 InputStreamReaderEx,如下所示:

/** * @author kellogs * */ public class InputStreamReaderEx extends 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;
}

}

并在其他对等方离开时得到通知

于 2011-08-09T16:52:10.313 回答