AS3: Socket 数据包 收 发

AS3.0 中使用Socket使用tcp服务器协议,它是一种流协议,不停的将分片传输给客户端,P作为流,发包是不会整包到达的,而是源源不断的。 它不同于UDP服务器协议,UDP作为数据包协议,整包到达。 如果要使用Socket接收数据我们必须使用ProgressEvent.SOCKET_DATA事 件。这个事件在帮助文档中是这样描述的 ——在套接字接收到数据后调度。 而事实却并非如此,做过一次尝试,服务器发送了20000次数据而 rogressEvent.SOCKET_DATA事件只产生了2000多次。 那么为什么说"服务器发送了20000次数据而 rogressEvent.SOCKET_DATA事件只产生了2000多次", 因为flash socket使用的TCP/IP协议, 这个协议跟UDP不同,它不是以单个"包"的形式发送数据,它发送的是"流数据",所以即便你发来20000次数据(也就是你所想象的20000个 包),TCP协议也是将它视作"流"发送. 换句话说,你的20000次数据,实际上只被分割成了2000多个"包"来发送,因此socket收 到了2000多个包,,因此只产生了2000多次的事件. 另外,如果as3 的data事件函数正在执行的时候,比如在此函数中用while循环解码,此时有新的数据发送过来,data事件还会触发么?触发的话,正在执行的怎么 办?原有数据还有么? 答案是会触发的,所以将socket数据read的时候,必须做一个循环 while,每到一个包刚好读取完成的时候(包头用一个整型记录完整包的长度。每次都先读取一个包长度,然后按照包长度读取指定长度的数据作为一个完整数 据包传递到到逻辑层),又继续读取下一个包,然后把解码后的每个包都放进一个数组里面依次读取。还有一点要注意的是 socket.bytesAvailable长度是每read一次就减去所读的长度,直至读取完毕,最后为0;此处的bytesAvailable如果重 新设置position为0,那该数组的bytesAvailable又是满的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章