在進行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數據是可行,但向一個收到Reset的Socket發送數據,則會出現異常。需要發送兩次才能出現異常,這是因為第一次發送數據時,當時的Socket只收到了Fin包,所以正常。第一次的數據發送到對方,對方因連接已關閉,協議棧回復Reset.?所以發送方第二次時發送數據時,這里的Socket收到了Reset,所以出現異常。
參考:http://blog.csdn.net/raintungli/article/details/8625126
?
本文轉自 anranran 51CTO博客,原文鏈接:http://blog.51cto.com/guojuanjun/1188161