服务器端使用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事件?

解决方案 »

  1.   

    我的个人理解
    1 网络延迟和阻塞是不可避免的
    2 你所谓的4个一次发出去是不能保证的,因为按照你的问题,只收到了3个。
    3 所以,问题的关键不在你怎么发送数据,而在于客户端如何处理收到的数据
    4 如果协议好每次都是3个int,+1个boolean,那么客户端在接受时,也要严格按照这个顺序,把已经接受到的保存好,继续接收下一个数据。
      接收完4个数据后再进行下一步的操作。 操作完毕,重复前面的操作,继续接收数据。调整你的flash的事件处理逻辑吧!
      

  2.   

    啊哈 这么晚了还不睡觉? 谢谢你的回答,你的意思我理解了,但是flash端不太好做,因为没有带缓冲的输入流。自己构建缓冲区有点麻烦。
    我先看看有没有更具体的答案,分数一会再给你
      

  3.   

    问题是数据包不全是3个int,+1个boolean 的形式的,还可能有1个int两个boolean形式的,总是有好多形式