作家:
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将在后续写入时提供给应用程序.