`
cloud21
  • 浏览: 397415 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Flash Socket 底层接受数据的初级处理(as3.0)

    博客分类:
  • Flex
阅读更多
用flash去开发应用,,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,前者其实是只支持发送字符串,而后者就强大多了,支持发送字节,相对来说比较底层,而这也给我们更多的发挥空间。 其实,flash socket的网络底层接受数据,就以与C++服务器通讯为例子,C++服务器一般会发一段一段数据过来,每段数据都是由一定结构组成的,一般是消息头和消息头,然后再逐步分层解析。 在这里,我只说接受网络底层的处理,一般一段数据前面,还有有一个4个字节左右的数据,表示的是后面网络流里的数据有多少.... 看下简单示意图

我们网络底层需要做的处理,就是根据头4个字节判断出后面的数据大小,然后把那一整块取出来,抛给上层解析,然后又在不停地侦听,收到指定大小之后,又做类似的操作,下面看详细的代码

/** 
 
 * @(#)NetBottomHandle.as 
 
 * @author soda.C  mail:sujun10@21cn.com 
 
 * @version  1.0 
 
 * <br>Copyright (C), 2007 soda.C 
 
 * <br>This program is protected by copyright laws. 
 
 * <br>Program Name:GameHall 
 
 * @data 2008-3-20 
 
 */  
  
package org.sujun.net   
  
{  
  
    import flash.net.Socket;  
  
    import flash.events.ProgressEvent;  
  
    import flash.utils.ByteArray;  
  
    /** 
 
     * socket数据流里的底层处理,从这里接受到服务器的数据,满足条件后就会抛出需要的字节 
 
     * 对数据流的数据,不做任何处理 
 
     */  
  
    public class NetBottomHandle   
  
    {  
  
        private var socket        :Socket;          
  
        private var listener    :Function;        //接受网络解析出来的数据  
  
        private var msgLen        :int;            //消息长度  
  
        private var msgLenMax    :int;            //收到的消息最大长度  
  
        private var headLen        :int;            //消息头长度  
  
        private var isReadHead    :Boolean;        //是否已经读了消息头  
  
        private var bytes        :ByteArray;        //所读数据的缓冲数据,读出的数据放在这里  
  
          
  
        public function NetBottomHandle()  
  
        {  
  
            msgLenMax = 5000;    //5000字节  
  
            headLen = 4;        //4个字节  
  
            bytes = new ByteArray();  
  
              
  
        }  
  
        /** 
 
         * 设置一个网络通讯实例 
 
         */    
  
        public function setSocket(socket:Socket):void  
  
        {  
  
            this.socket = socket;  
  
            //监听......  
  
            socket.addEventListener(ProgressEvent.SOCKET_DATA, onServerData,false,0,true);  
  
              
  
              
  
        }  
  
        /** 
 
         * 接受在网络层里收到的原始数据,传递过来的数据为描述长度,以及ByteArray对象functon(len,bytes) 
 
         * @param listener:接受数据函数 
 
         */  
  
        public function receiverNetData(listener:Function):void  
  
        {  
  
            this.listener = listener;  
  
        }  
  
        /** 
 
         * 服务器发送过来的数据都在这里接收,最底层的 
 
         */  
  
        private function onServerData(event:ProgressEvent):void  
  
        {  
  
            //一有收到数据的事件,就通过这个函数进行检验  
  
            parseNetData();  
  
        }  
  
        /** 
 
         * 解析网络数据流 
 
         */  
  
        private function parseNetData():void  
  
        {  
  
            //如果需要读信息头  
  
            if(isReadHead)  
  
            {  
  
                if(socket.bytesAvailable >= headLen)  
  
                {  
  
                    //读出指示后面的数据有多大  
  
                    msgLen = socket.readUnsignedInt();  
  
                    isReadHead = false;  
  
                }  
  
            }  
  
            //如果已经读了信息头,则看能不能收到满足条件的字节数  
  
            if(!isReadHead && msgLen <= msgLenMax)  
  
            {  
  
                //如果为0,表示收到异常消息  
  
                if(msgLen == 0)  
  
                {  
  
                    //一般消息长度为0的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理  
  
                    listener(msgLen,null);  
  
                    return ;  
  
                }  
  
                //数据流里的数据满足条件,开始读数据  
  
                if(socket.bytesAvailable >= msgLen)  
  
                {  
  
                    //指针回归  
  
                    bytes.position = 0;  
  
                    //取出指定长度的网络字节  
  
                    socket.readBytes(bytes, 0, msgLen);  
  
                    listener(msgLen,bytes);  
  
                }  
  
            }  
  
            isReadHead = false;  
  
            //如果数据流里还满足读取数据条件,继续读取数据  
  
            if(socket.bytesAvailable >= headLen)  
  
            {  
  
                parseNetData();  
  
            }  
  
        }  
  
    }  
  
}  
分享到:
评论

相关推荐

    flash as3.0 socket编程

    Flash AS3.0 Socket 编程 Flash AS3.0 中的 Socket 编程是使用 ActionScript 3.0 进行网络编程的一种方式。它允许 Flash 应用程序与服务器之间建立连接,以便进行数据交换。下面是关于 Flash AS3.0 Socket 编程的...

    flashas3.0socket编程

    资源名称:flash as3.0 socket编程 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    UDP.rar_as3 udp_flash as3.0 UDP_flash发送udp_udp as3_windows as3.0

    这个"UDP.rar_as3 udp_flash as3.0 UDP_flash发送udp_udp as3_windows as3.0"的压缩包,看起来包含了一个名为"UDP.fla"的文件,这是一个Flash的源文件,可能是一个AS3的项目,用于演示或教学如何在Flash中使用UDP...

    基于as3.0小游戏

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的主要编程语言,用于创建交互式内容、动画以及丰富的互联网应用程序(RIA)。基于AS3.0的小游戏,利用了其强大的性能和丰富的功能,为用户提供有趣且引人入胜的游戏...

    flash as3.0 编程手册

    8. **内置库和类**:Flash Player和 AIR(Adobe Integrated Runtime)为AS3.0提供了丰富的内置类库,如网络通信的Socket和URLLoader类,音频和视频处理的Sound和Video类,以及图形绘制的Graphics类等。 9. **...

    as3.0实例-入门可看

    AS3.0,全称ActionScript 3.0,是Adobe Flash平台中用于创建交互式内容、游戏和动画的一种编程语言。它在2006年发布,与之前的版本相比,有着显著的改进和性能提升,包括更强的类型检查、更高效的语言结构以及对面向...

    FLASHAS3.0官网教程实例(下).rar

    9. **WikiEditor**:基于AS3.0的维基编辑器实例,提供了文本编辑、保存和加载功能,对于理解AS3.0中的文本处理和数据存储有很大帮助。 10. **WordSearch**:单词搜索游戏实例,开发者可以从中学习到如何实现游戏...

    FLASH AS3 SOCKET收发16进制示例

    总的来说,"FLASH AS3 SOCKET收发16进制示例"涵盖了网络编程的基础,以及如何在Flash环境中处理16进制数据。了解这些概念和技巧对于开发需要实时通信的Flash应用程序至关重要。记住,安全性和性能优化也是使用Socket...

    一段as3.0与c++socket通信的例子(as端代码)

    总之,AS3.0的Socket通信能力使得Flash和C++等不同平台之间能够进行实时、高效的数据交换,这对于构建跨平台的网络应用程序至关重要。理解并熟练掌握这些技术,对于开发涉及网络通信的项目非常有帮助。

    Flash as3.0 网站基础模型

    8. **网络通信**: 使用AS3.0的Socket、URLLoader和XMLSocket类,可以实现与服务器的数据交换,这对于构建交互式网站至关重要,比如用户登录、表单提交和实时更新。 9. **错误处理和调试**: AS3.0提供了强大的错误...

    自学flashas3.0书籍

    《高级教程ActionScript_3.pdf》是一本专为想要深入学习Flash AS3.0的读者精心编写的自学书籍。ActionScript 3.0是Adobe Flash平台的核心编程语言,它的出现极大地提升了Flash应用程序的性能和功能,使其在网页交互...

    as3.0 websocket

    "封装了socket"意味着这个库已经将底层的TCP套接字(socket)接口进行了抽象和简化,使得开发者无需直接处理复杂的网络编程细节,而能更专注于业务逻辑。"可以测试,很好用"则表明这个库经过了测试,具备良好的可用...

    Flash as3.0制作的格斗之路小游戏源码。

    《Flash AS3.0制作的格斗之路小游戏源码解析》 在数字娱乐领域,Flash技术曾是网页游戏和互动内容的重要制作工具,其ActionScript 3.0(AS3.0)版本更是提升了编程效率和性能。本篇文章将深入探讨以AS3.0编写的...

    [高质量的AS 3.0 动作脚本库]Advanced ActionScript Animation

    《高级ActionScript 3.0动画》是一本深入探讨AS 3.0在动画制作方面的专业书籍,特别针对Adobe Flash CS3和CS4版本。ActionScript是Flash平台的核心语言,用于构建交互式内容、游戏以及丰富的互联网应用程序。AS 3.0...

    聊天室(ActionScript3.0)

    总结来说,这款"聊天室(ActionScript 3.0实现)"项目涵盖了AS3.0编程、Flex框架应用、网络通信、事件处理、数据结构、UI设计等多个方面,对于学习和掌握AS3.0及其相关技术有着很好的实践价值。通过这个项目,开发者...

    AS3.0基础教程

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的主要编程语言,用于创建交互式内容、游戏和富互联网应用程序(RIA)。AS3.0的发布带来了许多改进和新特性,使得它成为开发高质量Flash内容的标准工具。这篇基础教程...

    AS3.0_AS3殿堂之路_笔记

    《AS3.0_AS3殿堂之路_笔记》是针对Adobe ActionScript 3.0(简称AS3)深入学习的一份详尽笔记,旨在帮助学习者系统掌握这一强大的编程语言,尤其对于想要在Flash平台上进行交互式内容开发的人员来说,这份笔记具有极...

    AS3.0-CS4最新中文帮助+.rar

    9. **LocalConnection和Socket**: AS3.0提供了LocalConnection和Socket类,用于在本地或网络上进行通信,支持客户端和服务器之间的数据交换。 10. **Timeline控制**: AS3.0允许开发者通过代码控制时间轴的行为,如...

    FlashSocket与C#通讯

    FlashSocket的数据通常是二进制格式,因此在C#服务器端也需要解析这种格式的数据。 4. **安全性和跨域问题**:由于浏览器的安全策略,FlashSocket需要设置crossdomain.xml文件,允许特定的源进行通信。同时,C#...

    AS3.0开发MMORPG游戏概要.pdf

    由于文件中提到Flash和AS3.0,可以推断在游戏开发中,AS3.0被用于编写游戏逻辑、处理用户输入、网络通信等。 2. Erlang与AS3.0的关联:文件中出现了Erlang,这可能表明在MMORPG后端的分布式计算和并发处理方面可能...

Global site tag (gtag.js) - Google Analytics