`
hereson2
  • 浏览: 462143 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

BaseSocket类-可以提升Socket数据传输效率

    博客分类:
  • flex
阅读更多

[AS3]BaseSocket类-可以提升Socket数据传输效率
需要Flash Player 9.0或更高版本的支持
原理就是结合AMF3和ByteArray的特性对原来数据进行压缩后再传输,这样就可以大大提高数据传输效率。
我现在把客户端方法进行优化,现在写成一个BaseSocket类来方便调用。

BaseSocket类

  1. /**  
  2. * @author Kinglong  
  3. * @link kinglong@gmail.com  
  4. * @builddate 20081121  
  5. * @flashplayerversion 9+  
  6. * @version 0.1  
  7. */   
  8.   
  9. package  com.klstudio.socket {     
  10.       
  11.     import  flash.events.*;  
  12.     import  flash.net.Socket;  
  13.     import  flash.net.ObjectEncoding;  
  14.     import  flash.system.Security;  
  15.     import  flash.utils.ByteArray;  
  16.   
  17.     public   class  BaseSocket  extends  EventDispatcher{  
  18.           
  19.         private  var _host:String;  
  20.         private  var _port:uint;  
  21.         private  var _socket:Socket;  
  22.           
  23.         public  function BaseSocket(host:String, port:uint =  80 ) {  
  24.             this ._host = host;  
  25.             this ._port = port;  
  26.             this ._socket =  new  Socket();  
  27.             this ._socket.objectEncoding = ObjectEncoding.AMF3;            
  28.             Security.loadPolicyFile("xmlsocket://"  +  this .host +  ":"  +  this .port);  
  29.             this ._socket.addEventListener(Event.CONNECT, handler);  
  30.             this ._socket.addEventListener(Event.CLOSE, handler);  
  31.             this ._socket.addEventListener(IOErrorEvent.IO_ERROR, handler);  
  32.             this ._socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handler);  
  33.             this ._socket.addEventListener(ProgressEvent.SOCKET_DATA, handler);  
  34.         }  
  35.           
  36.         public  function get host():String {  
  37.             return  _host;  
  38.         }  
  39.           
  40.         public  function get port():uint {  
  41.             return  _port;  
  42.         }  
  43.           
  44.         public  function get connected():Boolean {  
  45.             return   this ._socket.connected;  
  46.         }  
  47.           
  48.         public  function connect(): void  {  
  49.             this ._socket.connect(host, port);  
  50.         }  
  51.           
  52.         public  function close(): void  {  
  53.             this ._socket.close();  
  54.         }  
  55.           
  56.         public  function send(params:Object= null ): void  {  
  57.             if (! this .connected || params ==  null ){  
  58.                 return ;  
  59.             }  
  60.             var bytes:ByteArray = new  ByteArray();  
  61.             bytes.writeObject(params);  
  62.             bytes.compress();  
  63.             this ._socket.writeBytes(bytes);  
  64.             this ._socket.flush();  
  65.             this .dispatchEvent( new  BaseSocketEvent(BaseSocketEvent.SENDING, params));             
  66.         }  
  67.           
  68.         private  function received(): void  {                
  69.             var bytes:ByteArray = new  ByteArray();  
  70.             while  ( this ._socket.bytesAvailable >  0 ) {  
  71.                 this ._socket.readBytes(bytes,  0 this ._socket.bytesAvailable);  
  72.             }  
  73.             try {                  
  74.                 bytes.uncompress();  
  75.                 this .dispatchEvent( new  BaseSocketEvent(BaseSocketEvent.RECEIVED, bytes.readObject()));  
  76.             }catch  (error:Error) {  
  77.                 this .dispatchEvent( new  BaseSocketEvent(BaseSocketEvent.DECODE_ERROR));  
  78.             }  
  79.         }  
  80.           
  81.         private  function handler(event:Event): void  {  
  82.             switch (event.type) {  
  83.                 case  Event.CLOSE:  
  84.                     this .dispatchEvent( new  BaseSocketEvent(BaseSocketEvent.CLOSE));  
  85.                     break ;  
  86.                 case  Event.CONNECT:                   
  87.                 case  IOErrorEvent.IO_ERROR:  
  88.                 case  SecurityErrorEvent.SECURITY_ERROR:  
  89.                     this .dispatchEvent( new  BaseSocketEvent(event.type));  
  90.                     break ;  
  91.                 case  ProgressEvent.SOCKET_DATA:  
  92.                     this .received();  
  93.                     break ;  
  94.             }  
  95.         }  
  96.     }  
  97. }  


BaseSocketEvent类

  1. /**  
  2. * @author Kinglong  
  3. * @link kinglong@gmail.com  
  4. * @builddate 20081121  
  5. * @flashplayerversion 9+  
  6. * @version 0.1  
  7. */   
  8.   
  9. package  com.klstudio.socket {  
  10.           
  11.     import  flash.events.*;  
  12.   
  13.     public   class  BaseSocketEvent  extends  Event {  
  14.           
  15.         public   static   const  SECURITY_ERROR:String = SecurityErrorEvent.SECURITY_ERROR;  
  16.         public   static   const  IO_ERROR:String = IOErrorEvent.IO_ERROR;  
  17.         public   static   const  DECODE_ERROR:String =  "decode_error" ;  
  18.         public   static   const  RECEIVED:String =  "received" ;  
  19.         public   static   const  SENDING:String =  "sending" ;  
  20.         public   static   const  CLOSE:String = Event.CLOSE;  
  21.         public   static   const  CONNECT:String = Event.CONNECT;  
  22.           
  23.         private  var _data:Object;  
  24.           
  25.         public  function BaseSocketEvent(type:String, data:Object =  null ) {  
  26.             super (type,  true );  
  27.             this ._data = data;            
  28.         }  
  29.           
  30.         public  function get data():Object {  
  31.             return  _data;  
  32.         }  
  33.           
  34.         override public  function toString():String {  
  35.             return  formatToString( "BaseSocketEvent" "type" "bubbles" "cancelable" "data" );  
  36.         }  
  37.           
  38.         override public  function clone():Event {  
  39.             return   new  BaseSocketEvent(type, data);  
  40.         }  
  41.     }  
  42.       
  43. }  


调用实例

  1. /**  
  2. * ...  
  3. * @author Kinglong  
  4. * @version 0.1  
  5. */   
  6.   
  7. package  project.test {  
  8.       
  9.     import  flash.display.*;  
  10.     import  flash.events.*;  
  11.     import  flash.text.TextField;  
  12.       
  13.     import  com.klstudio.data.Map;  
  14.     import  com.klstudio.socket.BaseSocket;  
  15.     import  com.klstudio.socket.BaseSocketEvent;  
  16.       
  17.     public   class  TestGame  extends  Sprite {    
  18.         private  var _socket:BaseSocket;  
  19.         private  var _id:uint;  
  20.         private  var _lists:Map;  
  21.         private  var _info:TextField;  
  22.         public  function TestGame() {              
  23.             _info = new  TextField();  
  24.             _info.selectable = false ;             
  25.             _info.text = "未连接" ;  
  26.             addChild(_info);          
  27.               
  28.             stage.addEventListener(MouseEvent.MOUSE_UP, stageHandler);            
  29.             _lists = new  Map();  
  30.             _socket = new  BaseSocket( "localhost" 110 );  
  31.             configureListeners(_socket);  
  32.             _socket.connect();            
  33.         }     
  34.           
  35.         private  function configureListeners(dispatcher:IEventDispatcher): void  {  
  36.             dispatcher.addEventListener(BaseSocketEvent.CLOSE, handler);  
  37.             dispatcher.addEventListener(BaseSocketEvent.CONNECT, handler);  
  38.             dispatcher.addEventListener(BaseSocketEvent.IO_ERROR, handler);  
  39.             dispatcher.addEventListener(BaseSocketEvent.SECURITY_ERROR, handler);  
  40.             dispatcher.addEventListener(BaseSocketEvent.SENDING, handler);  
  41.             dispatcher.addEventListener(BaseSocketEvent.RECEIVED, handler);  
  42.             dispatcher.addEventListener(BaseSocketEvent.DECODE_ERROR, handler);  
  43.         }  
  44.           
  45.         private  function handler(event:BaseSocketEvent): void  {  
  46.             switch (event.type) {  
  47.                 case  BaseSocketEvent.RECEIVED:  
  48.                     receive(event.data);  
  49.                     break ;  
  50.                 case  BaseSocketEvent.CLOSE:  
  51.                     debug("连接关闭" );  
  52.                     removeAll();  
  53.                     break ;  
  54.                 case  BaseSocketEvent.CONNECT:  
  55.                     debug("连接中..." );  
  56.                     _socket.send( { event:"init"  } );  
  57.                     break ;  
  58.                 case  BaseSocketEvent.IO_ERROR:  
  59.                 case  BaseSocketEvent.SECURITY_ERROR:  
  60.                     debug("连接失败" );  
  61.                     break ;  
  62.                 case  BaseSocketEvent.DECODE_ERROR:  
  63.                     debug("解码失败" );  
  64.                     break ;    
  65.             }  
  66.         }  
  67.           
  68.         private  function stageHandler(event:MouseEvent): void  {  
  69.             _socket.send( { event:"move" , x: this .mouseX, y: this .mouseY } );  
  70.         }  
  71.           
  72.         private  function receive(object:Object): void  {  
  73.             switch (object.event) {  
  74.                 case   "init" :  
  75.                     init(object.id);  
  76.                     for  (var i:uint =  0 ; i < object.list.length; i++ ) {  
  77.                         var item:Object = object.list[i];  
  78.                         add(item.id, item.x, item.y);  
  79.                     }  
  80.                     break ;  
  81.                 case   "move" :  
  82.                     move(object.id, object.x, object.y);                      
  83.                     break ;  
  84.                 case   "remove" :  
  85.                     remove(object.id);                    
  86.                     break ;  
  87.                 case   "add" :  
  88.                     add(object.id);  
  89.                     break ;  
  90.             }  
  91.         }  
  92.           
  93.         private  function init(id:uint): void  {  
  94.             this ._id = id;  
  95.             add(id);  
  96.         }  
  97.           
  98.         private  function add(id:uint, x:Number = undefined, y:Number = undefined): void  {              
  99.             x = x || stage.stageWidth / 2 ;  
  100.             y = y || stage.stageHeight / 2 ;  
  101.             if  (_lists.containsKey(id)) {  
  102.                 return ;  
  103.             }  
  104.             var role:GameRole = new  GameRole(id,_id == id);  
  105.             role.move(x,y);  
  106.             addChild(role);  
  107.             _lists.put(id, role);  
  108.         }  
  109.           
  110.         private  function move(id:uint, x:Number, y:Number): void  {  
  111.             if  (_lists.containsKey(id)) {  
  112.                 var role:GameRole = _lists.get(id);  
  113.                 role.to(x, y);  
  114.             }  
  115.         }  
  116.           
  117.         private  function remove(id:uint): void  {  
  118.             if  (_lists.containsKey(id)) {  
  119.                 var role:GameRole = _lists.remove(id);  
  120.                 trace(role);  
  121.                 if  ( this .contains(role)) {  
  122.                     removeChild(role);                    
  123.                 }  
  124.                 role = null ;  
  125.             }  
  126.         }  
  127.           
  128.         private  function removeAll(): void  {  
  129.             var keys:Array = _lists.keys;  
  130.             for  (var i:uint =  0 ; i < keys.length; i++ ) {  
  131.                 var role:GameRole = _lists.remove(keys[i]);               
  132.                 if  ( this .contains(role)) {  
  133.                     removeChild(role);  
  134.                 }  
  135.                 role = null ;                  
  136.             }  
  137.         }  
  138.           
  139.         private  function debug(msg:String): void  {  
  140.             _info.text = msg;  
  141.             trace(msg);  
  142.         }  
  143.           
  144.     }  
  145.       
  146. }  

分享到:
评论

相关推荐

    objective-c实现socket的几个Demo

    Objective-C是一种强大的面向对象的编程语言,特别是在Apple的iOS和Mac OS X平台上广泛使用。...通过实践和研究提供的Demo,你可以更好地掌握Objective-C中Socket编程的细节,从而提升你的iOS和Mac开发技能。

    计算机网络实验--基于Socket的消息传输程序的实现.pdf

    【计算机网络实验--基于Socket的消息传输程序的实现】 在计算机网络中,Socket是一种通信接口,它允许...通过这些步骤,可以实现基于Socket的消息传输程序,允许两台或多台计算机通过TCP/IP网络进行高效可靠的通信。

    cocos2d-x+socket

    这些示例通常会涵盖Socket的创建、连接、数据传输以及错误处理等方面,对于初学者来说是非常有价值的参考资料。 总结,cocos2d-x结合Socket网络通信,能构建出高性能、实时的网络游戏。通过理解和实践上述知识点,...

    TCP-UDP-Socket调试工具2.2.3

    在实际应用中,了解TCP-UDP-Socket调试工具的使用方法和原理,能够极大地提升开发和运维人员的效率,有效地解决网络通信中的问题,保证服务的稳定性和可靠性。通过这款工具,我们可以模拟不同的网络环境,测试应用...

    Modbus-Tcp采用Socket与NModbus两种方式

    标题中的“Modbus-Tcp采用Socket与NModbus两种方式”指的是在实现基于Modbus-TCP协议的通信时,采用了两种不同的技术手段:Socket编程和使用NModbus库。这两种方法都是为了与支持Modbus-TCP协议的设备进行数据交换。...

    java文件传输----socket

    实际应用中,可能还需要考虑文件的分块传输、断点续传、错误重传等高级特性,以提高传输效率和可靠性。在进行文件传输时,确保正确处理数据流的读写、网络异常以及资源管理,是编写可靠程序的关键。

    c++--java,socket.zip

    - **性能优化**:合理设置缓冲区大小,避免频繁的小规模数据传输,提高通信效率。 通过这个项目,开发者可以学习到如何跨越语言边界,利用Socket实现不同平台之间的通信。这不仅对理解网络编程原理有帮助,也为构建...

    cocos2d-x + socket

    而socket是网络编程中的基本组件,用于在不同设备之间建立连接并传输数据。 在cocos2d-x中实现socket连接封装,主要是为了在游戏中实现实时的网络通信功能,比如多人在线对战、实时同步游戏状态或者服务器推送更新...

    SuperSocket-master_Socket基于TCP、UDP

    - UDP应用可以利用SuperSocket的多线程处理和缓冲区管理机制,提高数据处理效率。 - 开发者可以通过定义自定义协议解析器,方便地处理UDP数据包。 **SuperSocket核心组件** 1. **Server**: 作为服务端的核心,...

    Socket数据传输(简单而使用)

    Socket数据传输,实现了网路数据传输和局域网数据传输,有前端和客户端,对了解多线程有好处,不好之处请评分指教。:-) 补充(在ClientTest类里有一段代码如下: System.out.println("文件接收了" + (passedlen * ...

    HPSocket--UDP传输客户端应用实例

    通过上述步骤,我们可以构建一个基于HPSocket的UDP传输客户端,高效地接收和处理矿用产量数据。这样的系统对于实时监控、数据分析和决策支持具有重要价值。在实际应用中,还需考虑安全性、负载均衡、容错机制等多...

    跨平台的socket库,windows-linux-socket

    通过这种方式,开发者可以专注于业务逻辑,而不是关注底层操作系统的差异,提高开发效率和代码可维护性。 总之,“跨平台的socket库,windows-linux-socket”是一个旨在消除操作系统差异的工具,它通过抽象和封装...

    TCP-UDP-SocketTool调试工具

    对于开发者而言,TCP-UDP-SocketTool这样的工具能够极大地提高网络通信调试的效率,尤其是在开发网络应用或解决网络问题时。通过它,我们可以直观地看到数据在网络中的流动,理解TCP和UDP的工作原理,以及如何利用...

    Java中Socket通信-客户端与服务端相互传输对象数据示例代码.rar

    通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将...

    HP-Socket压力测试 易源代码

    2. 数据传输速率测试:测试在一定时间内服务器处理和传输数据的速度,评估带宽利用率。 3. 稳定性测试:长时间运行压力测试,检查系统是否会出现内存泄漏、性能下降等问题。 4. 错误恢复测试:模拟网络异常情况,如...

    端口工具TCP-UDP-Socket2.2.3简略版

    端口工具TCP-UDP-Socket2.2.3简略版是一款专为软件和硬件开发者设计的测试...通过使用这个工具,开发者可以更深入地理解TCP和UDP协议的工作原理,以及如何利用Socket进行有效通信,从而提升开发工作的效率和专业水平。

    Java-network-socket-programming.zip_java programming_java socket

    2. Socket类:客户端使用Socket类建立到服务器的连接,并通过getInputStream()和getOutputStream()获取输入流和输出流,实现数据传输。 3. InputStream和OutputStream:Socket通信的基础,分别用于读取和写入数据。...

    前端开源库-koa-socket

    Socket.io则是一个强大的实时应用程序框架,它允许在客户端和服务器之间进行实时双向通信,支持多种传输协议,确保数据的可靠传输。 Koa的核心特性在于其使用了ES6的类和生成器(generator),这使得错误处理更加...

    C# 开发的Socket数据传输项目

    本项目“C#开发的Socket数据传输项目”就是专注于利用C#语言实现Socket服务,以实现客户端和服务端之间的实时通信功能。下面我们将深入探讨相关知识点。 首先,Socket是计算机网络中的接口,它允许两个程序通过网络...

Global site tag (gtag.js) - Google Analytics