JAVA 网络编程小记
在進(jìn)行JAVA網(wǎng)絡(luò)編程時(shí),發(fā)現(xiàn)寫入的數(shù)據(jù)對(duì)方等200ms左右才會(huì)收到。起初認(rèn)為是JAVA自已進(jìn)行了?Cache。進(jìn)行flush也沒(méi)有效果。查看JDK代碼,Write操作直接調(diào)用的native方法,說(shuō)明JAVA層面并沒(méi)有緩存。再看flush,只是一個(gè)空方法. FileOutputStream一樣,在進(jìn)行write的時(shí)候已經(jīng)寫入OS。后來(lái)發(fā)現(xiàn)是tcpNoDelay的問(wèn)題。參考:
http://www.iteye.com/topic/1110883
http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=61e3ecc1489150ffffffffcc5ccaf3f797827?bug_id=4358695.
另外一個(gè)問(wèn)題,?對(duì)方把連接關(guān)閉了。但發(fā)送方還能寫入數(shù)據(jù),有時(shí)第二次才會(huì)出錯(cuò)。經(jīng)調(diào)查取證,這是因?yàn)閷?duì)于Tcp/Ip協(xié)議,向一個(gè)已收到Fin包的Socket數(shù)據(jù)是可行,但向一個(gè)收到Reset的Socket發(fā)送數(shù)據(jù),則會(huì)出現(xiàn)異常。需要發(fā)送兩次才能出現(xiàn)異常,這是因?yàn)榈谝淮伟l(fā)送數(shù)據(jù)時(shí),當(dāng)時(shí)的Socket只收到了Fin包,所以正常。第一次的數(shù)據(jù)發(fā)送到對(duì)方,對(duì)方因連接已關(guān)閉,協(xié)議棧回復(fù)Reset.?所以發(fā)送方第二次時(shí)發(fā)送數(shù)據(jù)時(shí),這里的Socket收到了Reset,所以出現(xiàn)異常。
參考:http://blog.csdn.net/raintungli/article/details/8625126
?
本文轉(zhuǎn)自 anranran 51CTO博客,原文鏈接:http://blog.51cto.com/guojuanjun/1188161
總結(jié)
以上是生活随笔為你收集整理的JAVA 网络编程小记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle Study之--Oracl
- 下一篇: es6重点笔记:数值,函数和数组