作者:
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)跑出来,第四个写()将抛出。
答案 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;
}
}
并在其他同伴离开时收到通知