作者yzugsr (Bird)
看板java
标题Re: [问题] socket传送数值出错
时间Fri Jan 18 22:09:09 2008
※ 引述《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)