Re: [問題] socket傳送數值出錯
※ 引述《yzugsr (Bird)》之銘言:
: ※ 引述《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已經送達,再一次讀進來」
反正就是client server 都是java 就好處理多了, 更別說都是你自己寫
就更好了.
用c 寫, 我相信沒幾個人會傳int float 之類的東西, 又不是太閒.
就是我看到過的spec 也沒人直接傳int 的.
anyway, protocol 這東西, 高興就好了, 遇到問題再說囉.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.161.116
推
01/18 23:37, , 1F
01/18 23:37, 1F
→
01/18 23:38, , 2F
01/18 23:38, 2F
推
01/19 00:21, , 3F
01/19 00:21, 3F
→
01/19 00:22, , 4F
01/19 00:22, 4F
→
01/19 00:54, , 5F
01/19 00:54, 5F
推
01/21 14:57, , 6F
01/21 14:57, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 10 之 10 篇):