在进行JAVA网络编程时,发现写入的数据对方等200ms左右才会收到。起初认为是JAVA自已进行了 Cache。进行flush也没有效果。查看JDK代码,Write操作直接调用的native方法,说明JAVA层面并没有缓存。再看flush,只是一个空方法. FileOutputStream一样,在进行write的时候已经写入OS。后来发现是tcpNoDelay的问题。参考:

http://www.iteye.com/topic/1110883

http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=61e3ecc1489150ffffffffcc5ccaf3f797827?bug_id=4358695.

另外一个问题, 对方把连接关闭了。但发送方还能写入数据,有时第二次才会出错。经调查取证,这是因为对于Tcp/Ip协议,向一个已收到Fin包的Socket数据是可行,但向一个收到ResetSocket发送数据,则会出现异常。需要发送两次才能出现异常,这是因为第一次发送数据时,当时的Socket只收到了Fin包,所以正常。第一次的数据发送到对方,对方因连接已关闭,协议栈回复Reset. 所以发送方第二次时发送数据时,这里的Socket收到了Reset,所以出现异常。

参考:http://blog.csdn.net/raintungli/article/details/8625126