Socket如何发送数据包?

WiZiM 2008-01-30 10:45:43
服务器端使用Socket对客户端发送数据,服务器端使用DataOutputStream装饰BufferOutputStream,
即new DataOutputStream(new BufferOutputStream(out))来构造输出流
使用输出流的方法writeInt(),writeUTF()等方法将数据写入到缓冲区,然后调用flush()将数据一起发送出去。

比如我向客户端传达数据包(int+int+int+boolean)这种形式的数据包,我就使用三次writeInt(),和一次writeBoolean()然后使用flush()将这4个数据一次发送出去。

一般来说客户端接受的时候会触发一次数据来到的事件,比如客户端是flash,就会触发一次ProgressEvent.SOCKET_DATA事件。
但是遇到网络阻塞或者其他一些问题。 客户端有可能接受到三个int,boolean没有传送过来,就触发了ProgressEvent.SOCKET_DATA事件,等boolean到来的时候就又触发了一次ProgressEvent.SOCKET_DATA事件。我有没有什么办法让3个int和1个boolean 变成一个数据包,使客户端在接受到3个int以后不会立即触发ProgressEvent.SOCKET_DATA事件,而是等boolean到来,这个数据包完整了以后才触发ProgressEvent.SOCKET_DATA事件?
...全文
901 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2008-01-31
  • 打赏
  • 举报
回复
不需要缓冲,你做4个变量,以及一个计数器,每接受到一个数据,计数器加1,并设置对应的变量,如果计数器到4,则进行程序处理。明白了吗?
WiZiM 2008-01-31
  • 打赏
  • 举报
回复
问题是数据包不全是3个int,+1个boolean 的形式的,还可能有1个int两个boolean形式的,总是有好多形式
WiZiM 2008-01-31
  • 打赏
  • 举报
回复
啊哈 这么晚了还不睡觉? 谢谢你的回答,你的意思我理解了,但是flash端不太好做,因为没有带缓冲的输入流。自己构建缓冲区有点麻烦。
我先看看有没有更具体的答案,分数一会再给你
老紫竹 2008-01-31
  • 打赏
  • 举报
回复
我的个人理解
1 网络延迟和阻塞是不可避免的
2 你所谓的4个一次发出去是不能保证的,因为按照你的问题,只收到了3个。
3 所以,问题的关键不在你怎么发送数据,而在于客户端如何处理收到的数据
4 如果协议好每次都是3个int,+1个boolean,那么客户端在接受时,也要严格按照这个顺序,把已经接受到的保存好,继续接收下一个数据。
接收完4个数据后再进行下一步的操作。 操作完毕,重复前面的操作,继续接收数据。

调整你的flash的事件处理逻辑吧!

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧