Re: [問題] socket傳送數值出錯

看板java作者 (Bird)時間18年前 (2008/01/18 22:09), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串9/10 (看更多)
※ 引述《Lordaeron (Terry)》之銘言: : sorry, 看來是我習慣了用C 在寫了. : 你講得沒錯, 的確是像你所講的, 反正java 會幫你處理掉. : 不太會有其它的狀況發生. : but 我遇到大多數情況, 不會有人愛用read/write Int 的做法的. : 就是RFC 中也沒幾篇. : anyway, 我搞錯了. 你們在講不同層面的事吧.. Lordaeron應該是指 「TCP一起發送出去的data不一定會在同一個packet送達」 例如我送一個600bytes的data 可能會分在300bytes, 200bytes, 100bytes的三個packet中 這時用C (更精確的說 應該是berkley API或winsock API)的recv函式接收時 視你呼叫recv的時間點 buffer中可能會有300, 500或600個byte等你去接 也就是說 如果299~302這四個byte裡有一個int的資訊 寫的不好的程式 可能就會不小心發生錯誤 (buffer裡只有300個byte, 卻讀到第302個byte去) 不過稍微有經驗的人都可以避免掉這個問題.. 從Socket call getInputStream()得到的InputStream物件 也會有類似的狀況發生.. ==== 那解決的方法....如同呂布大講的 用DataInputStream包一層就好了.... 不過並不是「Java會幫你處理掉」 (嗯..可以說DataInputStream處理掉的..) 要直接操作InputStream時還是要注意.. 用C寫的話也一樣啊.... 可以自己包ReadInt() ReadFloat()這些函式 或者包裝成「確認整個message已經送達,再一次讀進來」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.33.7 ※ 編輯: yzugsr 來自: 123.193.33.7 (01/18 22:11)
文章代碼(AID): #17aBC8Sz (java)
討論串 (同標題文章)
文章代碼(AID): #17aBC8Sz (java)