`
Poechant
  • 浏览: 229605 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24328
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22104
社区版块
存档分类
最新评论

AS3 TCP Socket 拆包

 
阅读更多

AS3 TCP Socket 拆包


在 AS3 中的 Socket 只有 TCP 一种方式,而 TCP 就必然面临拆包的问题。对于 Windows、Linux、Mac等操作系统的不同网络模型,Flash 程序在不拆包下的运行糟糕程度不一样,我的亲身体会是 Windows 的网络模型会积攒更大的缓冲区数据让 Flash TCP Socket 每次收到的数据量都比 Mac 上的多,所以情况就更糟糕。这时候拆包的效果就十分明显。

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


One Small Caveat of Socket Buffer

In a stream-based transport such as TCP/IP, received data is stored into a socket
receive buffer. Unfortunately, the buffer of a stream-based transport is not a queue of
packets but a queue of bytes. It means, even if you sent two messages as two independent
packets, an operating system will not treat them as two messages but as just a bunch of
bytes. Therefore, there is no guarantee that what you read is exactly what your remote
peer wrote. For example, let us assume that the TCP/IP stack of an operating system has
received 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 the
received data into one or more meaningful frames that could be easily understood by the
application logic. In case of the example above, the received data should be framed like the
following:

+-----+-----+-----+
| 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

-

分享到:
评论

相关推荐

    c#tcp 粘包拆包解决方法,包头加数据长度

    发生TCP粘包或拆包有很多原因,现列出常见...3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。 4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

    Golang TCP粘包拆包问题的解决方法

    ### Golang TCP粘包拆包问题的解决方法 #### 一、引言 在使用Go语言进行网络编程时,特别是TCP编程过程中,经常会遇到所谓的“粘包”与“拆包”问题。这些问题的发生通常会影响到数据的正确性以及系统的稳定性。...

    tcp 粘包 拆包解决思路以代码

    在TCP协议中,由于其流式传输的特性,可能会出现“粘包”和“拆包”的问题。这两个术语是网络编程中的常见概念,主要涉及到数据在网络传输过程中的封装与解析。 **TCP粘包**:当发送方连续发送多个数据包时,接收方...

    好用的Tcp Socket调试工具

    3. **数据发送与接收**:用户可以通过工具直接向指定的Socket发送数据,同时接收服务器返回的数据,进行交互测试。 4. **流量控制**:支持设置数据包大小、间隔时间等参数,模拟不同网络环境下的通信情况。 5. **...

    Android Socket TCP

    本文将深入探讨Android平台上的Socket TCP通信,这是Android应用与服务器进行数据交换的常见技术。首先,我们来了解一下TCP(Transmission Control Protocol)的基本概念。 TCP是一种面向连接的、可靠的传输层协议...

    unity实现Socket通讯(内含tcp粘包/拆包解决)

    本教程将深入探讨如何在Unity中实现Socket通信,包括TCP连接、粘包/拆包问题的解决方案。 一、TCP连接基础 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Unity中...

    (AS3)socket+客户端与服务端+实例

    本文将深入探讨基于ActionScript 3(AS3)的Socket通信,包括客户端与服务端的交互,以及如何通过提供的实例来理解这一过程。我们将不涉及具体代码,而是详细解释相关的概念和技术要点。 首先,Socket是网络编程中...

    使用Netty解决TCP粘包和拆包问题过程详解

    使用Netty解决TCP粘包和拆包问题过程详解 Netty是一个流行的Java网络编程框架,提供了简洁、灵活的API来处理网络编程的各种问题。其中,解决TCP粘包和拆包问题是Netty的一个重要应用场景。本文将详细介绍使用Netty...

    【QT】自定义协议解决TCP粘包和拆包问题

    然而,TCP并不保证数据包的边界,即发送方发送的数据可能会被粘连在一起或者拆分成多个小块,这种现象被称为“粘包”或“拆包”。在某些需要精确控制数据传输的应用中,如游戏、实时通信等,解决TCP粘包和拆包问题是...

    Netty的技术的总结(Marshalling编解码,tcp的拆包粘包,webservice),包括新手入门源码,注释清楚,绝对物超所值

    **TCP的拆包粘包问题**:TCP是面向字节流的协议,不区分消息边界,可能导致数据接收方无法准确解析消息。Netty通过提供一系列的编解码器,如LengthFieldBasedFrameDecoder,解决了这个问题。它可以根据前导长度字段...

    Android TCP Socket通信实例Demo源码Apk下载

    最近有个项目模块需要用到TCP Socket通讯,遇到了一个大坑,所以做了这个Demo。 本Demo主要实现了安卓(Android)TCP 客户端(Client)和服务器(Server)Demo的Socket通讯。以及对接硬件的项目数据在十六进制&&byte&&int...

    php面试题之TCP粘包拆包

    php面试题 php面试题之TCP粘包拆包

    TCP socket服务端代码 C#

    本文将详细解析使用C#语言编写的TCP socket服务端代码,特别是针对GPRS(General Packet Radio Service)环境的服务端测试程序。 首先,TCP是一种面向连接的、可靠的传输协议,它确保了数据的顺序传输和无丢失特性...

    Netty精粹之TCP粘包拆包问题

    ### Netty精粹之TCP粘包拆包问题详解 #### 一、引言 在网络通信领域,尤其是在基于TCP协议的应用程序开发中,经常会遇到“粘包”和“拆包”的问题。这些问题虽然属于较为底层的技术细节,但对于保障数据传输的准确...

    WIN32 TCPsocket

    标题中的"WIN32 TCPsocket"指的是在Windows 32位平台上使用TCP协议进行网络通信的编程技术。TCP(Transmission Control Protocol)是一种面向连接、可靠的传输协议,它保证了数据包在互联网上的有序和无损传输。在...

    TCP socket 请求报文发送工具

    TCP套接字(TCP Socket)是网络通信中的一个重要概念,它是基于传输控制协议TCP的应用程序接口,用于在互联网上实现两台计算机之间的可靠数据传输。TCP确保数据在传输过程中的完整性,通过提供连接导向、面向字节流...

    tcpsocket.zip_TcpSocket_vc tcpsocket

    本文将深入探讨如何在Visual C++(简称VC++)环境下,利用TCP套接字进行网络编程,同时分享一个名为“TcpSocket_vc”的经典类库,它在实际项目中表现出色,值得学习和使用。 TCP是一种面向连接的、可靠的传输协议,...

    Tcp Socket client实例

    3. **连接服务器**:调用connect()函数,将Socket对象与服务器地址关联,启动连接过程。 4. **事件注册**:注册事件处理函数,如accept()用于接收连接,recv()和send()用于数据接收和发送,还有error handling相关...

    欧姆龙TCP UDP Socket网络通讯.zip

    3. **UDP Socket**: - UDP Socket适用于对实时性要求较高但可以容忍数据丢失的场景。它不保证数据包的顺序到达,也不处理重传,因此通常用于音频、视频流传输或实时游戏等。 - 在工业应用中,FINS UDP协议可能...

    TCPSOCKET 线程池通信客户端+服务器端示例代码

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)和SOCKET作为其基础,被广泛应用于各种应用程序的开发中。本示例代码着重于如何利用.NET框架实现基于TCP SOCKET的线程池通信,这对于高效处理大量...

Global site tag (gtag.js) - Google Analytics