我们使用 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 已触发!0 套接字 byteava = 373 evt 已加载:373 evt 总计:0 evt:[ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=373 bytesTotal=0]
从socket中找一个包,pLen=288 socket byteava = 276
ProgressEvent 触发!288 套接字 byteava = 441 evt 加载:165 evt 总计: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_
这就是问题所在!!带有另一个数据包标头的不完整数据包 cat。
这是 TCP 连接的捕获:
希望你能投票,这样我就可以把这个问题的照片放上去!
我的英文不是很好,希望你能明白我的意思。谢谢!