[AS3]Flash Socket底层接受数据的初级处理

原创 2008年06月29日 12:37:00
用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();

            }

        }

    }

}
代码我就不详细解说了,注释得很清楚,这段代码也是经过我写过几个版本锤炼过的。呵呵 在实际应用中,表现也是比较稳定的 当然,这是比较早期的了,以后再正正应用中,可能还需要做更多的处理,例如每个网络字节的缓冲,缓存等,以免过多字节造成socket出错等等 希望有兴趣的人继续留贴讨论,呵呵 下载文件点击下载此文件
版权声明:本文为博主原创文章,转载必须声明出处和作者。地址:http://blog.csdn.net/sujun10 作者:弃天笑

[AS3]Flash Socket底层接受数据的初级处理(转)

http://wgcode.iteye.com/blog/814837

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

flash去开发应用,,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,前者其实是只支持发送字符串,而后者就强大多了,支持发送字...

AS3 Socket使用ByteArray进行自定义数据处理

当Socket给我们传输数据的时候,我们可以侦听ProgressEvent事件进行加载读取。Socket的传输原理就跟下载文件一样,你在下载服务端那边的数据,只是数据是自定义的,但数据是按循序而来的。...

Flash/AS3与C++通过socket通信

c++部分 ///main.cpp #include iostream>  ///加载需要的头文件 关于输入输出 #include winsock2.h> ///socket...

用golang解决 Flash AS3 的 socket 安全策略文件问题

代码如下: package main import ( "bufio" "fmt" "net" "os" "time" ) const ( Head = 4 ) var ( Cl...

(转)保护自己的Flash程序(AS3) -- 基于socket方式传送swf文件

前段时间在flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件... 当时还没有出as3的反编译,所以对程序的保护没有在意.随着反编译程序的平民化,不希望...
  • gxj1680
  • gxj1680
  • 2012年03月21日 17:21
  • 723

flash as3/java socket 聊天室

  • 2008年09月30日 23:28
  • 1.65MB
  • 下载

flash as 3 socket资源(4)——同Socket服务器进行握手

4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据.解决方法:创建不同的常量来声明协议的状态.使用这些常量将指定的处理函数映射到相应的状态.在一个socketData事件控制...

Flash as3数据类型介绍

基本数据类型:int Boolean Number String uint 复杂数据类型:Array Object Null NAN undefined 1.值类型与引用类型   Flash as3里...

[原]as3 flash web 应用 (8)图片批量上传之 向服务器发送和获取额外数据

2010年06月21日 星期一 19:57 由于某度众所周知的铜臭举动,让我搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。 鉴于最近有些抓取机器和抄袭者,把标...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[AS3]Flash Socket底层接受数据的初级处理
举报原因:
原因补充:

(最多只允许输入30个字)