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

看板java作者 (Terry)時間18年前 (2008/01/18 22:59), 編輯推噓3(303)
留言6則, 4人參與, 最新討論串10/10 (看更多)
※ 引述《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
我真的試過很閒... Java 做 server... VC 寫 client...
01/18 23:37, 1F

01/18 23:38, , 2F
真心地說, C 真的寫得想要翻桌,但學到很多
01/18 23:38, 2F

01/19 00:21, , 3F
我也搞過BCB做Server Java做Client
01/19 00:21, 3F

01/19 00:22, , 4F
Java做Client是廠商要求方便port到3G手機
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
文章代碼(AID): #17aBxgKH (java)
討論串 (同標題文章)
文章代碼(AID): #17aBxgKH (java)