【发布时间】:2014-03-13 04:28:28
【问题描述】:
我们使用 AS3 Event:ProcessEvent.SOCKET_DATA 来监听套接字数据。 所以这是我的套接字数据句柄的 AS3 代码。
private function packetHandler( e:ProgressEvent ):void
{
while( m_socket.bytesAvailable && m_socket.bytesAvailable >= pLen )
{
//pLen means the packet length
//pLen init is zero
if( pLen == 0 )
{
//PACKET_LEN stands for the solid length of one packet
//PACKET_LEN = HEAD_LEN + 4
//the 4 means an unsigned int which means the packet content length
if( m_socket.bytesAvailable > PACKET_LEN )
{
m_socket.readBytes( headByteBuffer, 0, HEAD_LEN );
headByteBuffer.clear();
pLen = m_socket.readUnsignedInt() + 4;
}
else
{
break;
}
}
//recieved a whole packet now handle it
else
{
var newPacket:ByteArray = new ByteArray();
newPacket.endian = Endian.LITTLE_ENDIAN;
m_socket.readBytes( newPacket, 0, pLen );
parasMsg( newPacket, pLen-4 );
pLen = 0;
}
}
}
这张图片可以描述一个完整的数据包:
我的问题是:当 Flash 收到一个不完整的数据包并触发句柄时。 但是包的左边部分永远不会触发句柄,看起来包的左边部分已经丢失了!!!
我用了一个抓包工具,发现tcp数据包没问题,但是为什么左边部分没有再次触发事件?
您可以在下面获得更多调试信息。谢谢!
这是我的日志:
- byteava 表示 m_socket 的 bytesAvailable
==>sendPacket: {"rangeID":"1","uid":"145962","serviceType":"copyscene","cmd":"CopySceneMoveAsk","pathPoint":[{"col" :7,"row":6},{"col":7,"row":5},{"col":7,"row":4},{"col":7,"row":3 },{"col":6,"row":3}],"sn":"79","smallPathPoint":[[22,19],[22,18],[22,17],[22 ,16],[22,15],[22,14],[22,13],[21,13],[21,12],[21,11],[20,11],[20,10 ]]}, bytesLoaded = 463
ProgressEvent Triggered!0 socket byteava = 373 evt load:373 evt total:0 evt:[ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=373 bytesTotal=0]
从socket中找一个包,pLen=288 socket byteava = 276
ProgressEvent Triggered!288 socket byteava = 441 evt load:165 evt total:0 evt:[ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=165 bytesTotal=0]
开始读取数据包到缓冲区,pLen=288 socket byteava = 441
整个数据包内容:读取一个数据包到缓冲区,pLen=288 socket byteava = 153
服务器数据包内容字节缓冲区 ava:288 len:288 pos: 0
服务器参数数据:数据长度:284 数据内容:{"cmd":"CopySceneMoveNotify","gtcmd":"108","layer":"1","pathPoint":[{"col":7 ,"row":6},{"col":7,"row":5},{"col":7,"row":4},{"col":7,"row":3}, {"col":6,"row":3}],"smallPathPoint":[[22,19],[22,18],[22,17],[22,16],[22,15], [22,14],[22,13],[21,13],[21,12],[21,11],[20,11],[20,10]HTTP/1.1 200
_[20,10]HTTP/1.1 200_这就是问题所在!!带有另一个包头的不完整包猫。
以下是 TCP 连接的捕获:
希望你能投票,这样我就可以把这个问题的照片放在上面!
我的英文不是很好,希望你能明白我的意思。 谢谢!
【问题讨论】:
-
为什么e的类型是ProgressEvent?
-
ProgressEvent.SOCKET_DATA
-
我几乎可以肯定问题出在 packetHandler 中,尤其是在使用过程中。我的游戏是服务器/客户端,通信是通过套接字进行的,从来没有这样的问题。我也差不多如果你改变 m_socket.readBytes(newPacket, 0, pLen);到 m_socket.readBytes(newPacket, 0, m_socket.bytesAvailable);您将收到没有 HTTP/1.1 200_ 的消息
-
但是让我看到的是 ProgressEvent.SOCKET_DATA 没有被触发(所以它不会进入 while 循环),并且一个数据包的不完整部分似乎丢失了,因为它与另一个数据包的标题相匹配。
-
m_socket 中的bytesAvailable 有时不能是一个完整的数据包,所以如果我收到一个数据包的一半,我会将数据留在套接字缓冲区中。当收到整个数据包时,我将处理数据包并从套接字缓冲区读取数据包。