AS3 TCP Socket 拆包

來源:互聯網
上載者:User
AS3 TCP Socket 拆包
  • 作者:柳大·Poechant(鐘超)
  • 郵箱:zhongchao.ustc#gmail.com(# -> @)
  • 部落格:Blog.CSDN.net/Poechant
  • 微博:weibo.com/lauginhom
  • 日期:June 2nd, 2012

在 AS3 中的 Socket 只有 TCP 一種方式,而 TCP 就必然面臨拆包的問題。對於 Windows、Linux、Mac等作業系統的不同網路模型,Flash 程式在不拆包下的運行糟糕程度不一樣,我的親身體會是 Windows 的網路模型會積攢更大的緩衝區資料讓 Flash TCP Socket 每次收到的資料量都比 Mac 上的多,所以情況就更糟糕。這時候拆包的效果就十分明顯。

下面有一段更形象化的解釋,摘自 Netty 的

One Small Caveat of Socket BufferIn a stream-based transport such as TCP/IP, received data is stored into a socketreceive buffer. Unfortunately, the buffer of a stream-based transport is not a queue ofpackets but a queue of bytes. It means, even if you sent two messages as two independentpackets, an operating system will not treat them as two messages but as just a bunch ofbytes. Therefore, there is no guarantee that what you read is exactly what your remotepeer wrote. For example, let us assume that the TCP/IP stack of an operating system hasreceived three packets:
+-----+-----+-----+| ABC | DEF | GHI |+-----+-----+-----+
Because of this general property of a stream-based protocol, there's high chance of reading them in the following fragmented form in your application:
+----+-------+---+---+| AB | CDEFG | H | I |+----+-------+---+---+
Therefore, a receiving part, regardless it is server-side or client-side, should defrag thereceived data into one or more meaningful frames that could be easily understood by theapplication logic. In case of the example above, the received data should be framed like thefollowing:
+-----+-----+-----+| ABC | DEF | GHI |+-----+-----+-----+

下面執行個體中的 _socket 和 lastReservedLength 都是在函數外部定義的,其定義不影響程式的理解。各段含義我寫在了程式的注釋中。

部分代碼如下:

private function onResponse(e:ProgressEvent):void{    // Data available from socket    while (_socket.bytesAvailable > 0)    {        var tmpLength:int = 0;                // Last package received is incomplete, and package length maintains last reserved length        if (lastReservedLength > 0)        {            // CASE 1: Package is still incomplete after receiving data from socket at least once            if (lastReservedLength > _socket.bytesAvailable + 4) break;                                // CASE 2: The last part of a package            else tmpLength = lastReservedLength;        }            // Last package received is complete, and package length should be read from socket         else        {            var lengthBytes:ByteArray = new ByteArray();            lengthBytes.endian = Endian.LITTLE_ENDIAN;                        _socket.readBytes(lengthBytes, 0, 4); // TODO Crash!            //Error: Error #2030: End of file was encountered.            //at flash.net::Socket/readBytes()                        tmpLength = lengthBytes.readInt();                        // CASE 3: The first part of a package            if (_socket.bytesAvailable < tmpLength - 4)            {                lastReservedLength = tmpLength;                break;            }        }                // CASE 4: A complete package received once                // Generate ByteArray of a complete package        var resultBytes:ByteArray = new ByteArray();        resultBytes.writeInt(tmpLength);        _socket.readBytes(resultBytes, 4, tmpLength - 4);        lastReservedLength = 0;                // parse the ByteArray        resultBytes.position = 0;        var resProto:Object = CppLibUtil.parseMediaProto(resultBytes);                // Dispatch the ByteArray        if (resProto != null) {                        var uri:String;                        try {                uri = resProto.uri;            } catch (e:Event) {                trace(e);            }                            dispatchEvent(new InternalEvent(uri, resProto));        }    }}

-

轉載請註明來自柳大的CSDN部落格:Blog.CSDN.net/Poechant,微博:weibo.com/lauginhom

-

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.