本文共 552 字,大约阅读时间需要 1 分钟。
在进行JAVA网络编程时,发现写入的数据对方等200ms左右才会收到。起初认为是JAVA自已进行了 Cache。进行flush也没有效果。查看JDK代码,Write操作直接调用的native方法,说明JAVA层面并没有缓存。再看flush,只是一个空方法. FileOutputStream一样,在进行write的时候已经写入OS。后来发现是tcpNoDelay的问题。参考:
.
另外一个问题, 对方把连接关闭了。但发送方还能写入数据,有时第二次才会出错。经调查取证,这是因为对于Tcp/Ip协议,向一个已收到Fin包的Socket数据是可行,但向一个收到Reset的Socket发送数据,则会出现异常。需要发送两次才能出现异常,这是因为第一次发送数据时,当时的Socket只收到了Fin包,所以正常。第一次的数据发送到对方,对方因连接已关闭,协议栈回复Reset. 所以发送方第二次时发送数据时,这里的Socket收到了Reset,所以出现异常。
参考:http://blog.csdn.net/raintungli/article/details/8625126
本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/1188161