我们使用 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 连接的捕获:

希望你能投票,这样我就可以把这个问题的照片放上去!
我的英文不是很好,希望你能明白我的意思。谢谢!