作者Lordaeron (Terry)
站内java
标题Re: [问题] socket传送数值出错
时间Fri Jan 18 22:59:53 2008
※ 引述《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
1F:推 superlubu:我真的试过很闲... Java 做 server... VC 写 client... 01/18 23:37
2F:→ superlubu:真心地说, C 真的写得想要翻桌,但学到很多 01/18 23:38
3F:推 yzugsr:我也搞过BCB做Server Java做Client 01/19 00:21
4F:→ yzugsr:Java做Client是厂商要求方便port到3G手机 01/19 00:22
5F:→ Lordaeron:反正, 我相说难听点, 只有学生才会这样搞. 01/19 00:54
6F:推 xvid:真呛 01/21 14:57