`

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

    博客分类:
  • AS3
阅读更多

在家上网赚钱更容易

用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. margin: 0px; border-left: #6ce26c 3px solid; border-top-s
    分享到:
    评论

相关推荐

Global site tag (gtag.js) - Google Analytics