论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

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

文章类别:Flash AS编程 | 发表日期:2008-10-6 18:07:26


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



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

  1. /** 
  2.  
  3.  * @(#)NetBottomHandle.as 
  4.  
  5.  * @author soda.C  mail:sujun10@21cn.com 
  6.  
  7.  * @version  1.0 
  8.  
  9.  * <br>Copyright (C), 2007 soda.C 
  10.  
  11.  * <br>This program is protected by copyright laws. 
  12.  
  13.  * <br>Program Name:GameHall 
  14.  
  15.  * @data 2008-3-20 
  16.  
  17.  */  
  18.   
  19. package org.sujun.net   
  20.   
  21. {  
  22.   
  23.     import flash.net.Socket;  
  24.   
  25.     import flash.events.ProgressEvent;  
  26.   
  27.     import flash.utils.ByteArray;  
  28.   
  29.     /** 
  30.  
  31.      * socket数据流里的底层处理,从这里接受到服务器的数据,满足条件后就会抛出需要的字节 
  32.  
  33.      * 对数据流的数据,不做任何处理 
  34.  
  35.      */  
  36.   
  37.     public class NetBottomHandle   
  38.   
  39.     {  
  40.   
  41.         private var socket        :Socket;          
  42.   
  43.         private var listener    :Function;        //接受网络解析出来的数据  
  44.   
  45.         private var msgLen        :int;            //消息长度  
  46.   
  47.         private var msgLenMax    :int;            //收到的消息最大长度  
  48.   
  49.         private var headLen        :int;            //消息头长度  
  50.   
  51.         private var isReadHead    :Boolean;        //是否已经读了消息头  
  52.   
  53.         private var bytes        :ByteArray;        //所读数据的缓冲数据,读出的数据放在这里  
  54.   
  55.           
  56.   
  57.         public function NetBottomHandle()  
  58.   
  59.         {  
  60.   
  61.             msgLenMax = 5000;    //5000字节  
  62.   
  63.             headLen = 4;        //4个字节  
  64.   
  65.             bytes = new ByteArray();  
  66.   
  67.               
  68.   
  69.         }  
  70.   
  71.         /** 
  72.  
  73.          * 设置一个网络通讯实例 
  74.  
  75.          */    
  76.   
  77.         public function setSocket(socket:Socket):void  
  78.   
  79.         {  
  80.   
  81.             this.socket = socket;  
  82.   
  83.             //监听......  
  84.   
  85.             socket.addEventListener(ProgressEvent.SOCKET_DATA, onServerData,false,0,true);  
  86.   
  87.               
  88.   
  89.               
  90.   
  91.         }  
  92.   
  93.         /** 
  94.  
  95.          * 接受在网络层里收到的原始数据,传递过来的数据为描述长度,以及ByteArray对象functon(len,bytes) 
  96.  
  97.          * @param listener:接受数据函数 
  98.  
  99.          */  
  100.   
  101.         public function receiverNetData(listener:Function):void  
  102.   
  103.         {  
  104.   
  105.             this.listener = listener;  
  106.   
  107.         }  
  108.   
  109.         /** 
  110.  
  111.          * 服务器发送过来的数据都在这里接收,最底层的 
  112.  
  113.          */  
  114.   
  115.         private function onServerData(event:ProgressEvent):void  
  116.   
  117.         {  
  118.   
  119.             //一有收到数据的事件,就通过这个函数进行检验  
  120.   
  121.             parseNetData();  
  122.   
  123.         }  
  124.   
  125.         /** 
  126.  
  127.          * 解析网络数据流 
  128.  
  129.          */  
  130.   
  131.         private function parseNetData():void  
  132.   
  133.         {  
  134.   
  135.             //如果需要读信息头  
  136.   
  137.             if(isReadHead)  
  138.   
  139.             {  
  140.   
  141.                 if(socket.bytesAvailable >= headLen)  
  142.   
  143.                 {  
  144.   
  145.                     //读出指示后面的数据有多大  
  146.   
  147.                     msgLen = socket.readUnsignedInt();  
  148.   
  149.                     isReadHead = false;  
  150.   
  151.                 }  
  152.   
  153.             }  
  154.   
  155.             //如果已经读了信息头,则看能不能收到满足条件的字节数  
  156.   
  157.             if(!isReadHead && msgLen <= msgLenMax)  
  158.   
  159.             {  
  160.   
  161.                 //如果为0,表示收到异常消息  
  162.   
  163.                 if(msgLen == 0)  
  164.   
  165.                 {  
  166.   
  167.                     //一般消息长度为0的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理  
  168.   
  169.                     listener(msgLen,null);  
  170.   
  171.                     return ;  
  172.   
  173.                 }  
  174.   
  175.                 //数据流里的数据满足条件,开始读数据  
  176.   
  177.                 if(socket.bytesAvailable >= msgLen)  
  178.   
  179.                 {  
  180.   
  181.                     //指针回归  
  182.   
  183.                     bytes.position = 0;  
  184.   
  185.                     //取出指定长度的网络字节  
  186.   
  187.                     socket.readBytes(bytes, 0, msgLen);  
  188.   
  189.                     listener(msgLen,bytes);  
  190.   
  191.                 }  
  192.   
  193.             }  
  194.   
  195.             isReadHead = false;  
  196.   
  197.             //如果数据流里还满足读取数据条件,继续读取数据  
  198.   
  199.             if(socket.bytesAvailable >= headLen)  
  200.   
  201.             {  
  202.   
  203.                 parseNetData();  
  204.   
  205.             }  
  206.   
  207.         }  
  208.   
  209.     }  
  210.   
  211. }  
代码我就不详细解说了,注释得很清楚,这段代码也是经过我写过几个版本锤炼过的。呵呵 在实际应用中,表现也是比较稳定的 当然,这是比较早期的了,以后再正正应用中,可能还需要做更多的处理,例如每个网络字节的缓冲,缓存等,以免过多字节造成socket出错等等 希望有兴趣的人继续留贴讨论,呵呵 下载文件 点击下载此文件
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058