Re: [問題] socket傳送數值出錯
※ 引述《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)
討論串 (同標題文章)