请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

凌敏作品展 门户 编程思维 查看内容

利用AIR的ServerSocket类让 AIR 做socket服务器

2015-7-14 22:54| 发布者: lingmin| 查看: 2444| 评论: 0|原作者: lingmin

摘要: 新的air sdk 新增了 ServerSocket类, 利用它我们做一些简单的局域网应用,比如小型的办公聊天软件,以及一些基于socket的服务应用.这样as程序员可以自己搞定服务器端,不在去求于 java程序员.在一下大型应用还没有尝试 ...
新的air sdk 新增了 ServerSocket类, 利用它我们做一些简单的局域网应用,比如小型的办公聊天软件,以及一些基于socket的服务应用.这样as程序员可以自己搞定服务器端,不在去求于 java程序员.在一下大型应用还没有尝试过.期待有人能做一下大型应用的尝试.小型的办公应用足够能满足了.
首先看服务器端代码:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.events.MouseEvent;
  6.     import flash.events.ProgressEvent;
  7.     import flash.events.ServerSocketConnectEvent;
  8.     import flash.net.ServerSocket;
  9.     import flash.net.Socket;
  10.     import flash.text.TextField;
  11.     import flash.text.TextFieldType;
  12.     import flash.utils.ByteArray;

  13.     public class Main extends Sprite
  14.     {
  15.         private var serverSocket:ServerSocket = new ServerSocket();
  16.         private var clientSocket:Socket;

  17.         private var localIP:TextField;
  18.         private var localPort:TextField;
  19.         private var logField:TextField;
  20.         private var message:TextField;
  21.         private var _clients:Array = [];

  22.         public function Main()
  23.         {
  24.             setupUI();
  25.         }

  26.         //当客户端成功连接服务端
  27.         private function onConnect( event:ServerSocketConnectEvent):void
  28.         {
  29.             clientSocket = event.socket;
  30.             clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
  31.            _clients.push(clientSocket);
  32.             log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
  33.         }

  34.         //当有数据通信时
  35.         private function onClientSocketData( event:ProgressEvent ):void
  36.         {
  37.             var buffer:ByteArray = new ByteArray();
  38.             clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable );
  39.             log( "Received: " + buffer.toString() );

  40.                         for (var i:int = 0; i < _clients.length; i++)
  41.                         {
  42.                                 var item:Socket = _clients[i] as Socket;
  43.                                 if (!item) continue;
  44.                                 item.writeObject(buffer.toString());
  45.                                 item.flush();
  46.                         }


  47.         }
  48.         //绑定服务器ip 开始监听端口
  49.         private function bind( event:Event ):void
  50.         {
  51.             if( serverSocket.bound )
  52.             {
  53.                 serverSocket.close();
  54.                 serverSocket = new ServerSocket();

  55.             }
  56.             serverSocket.bind( parseInt( localPort.text ), localIP.text );
  57.             serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onConnect );
  58.             serverSocket.listen();
  59.             log( "Bound to: " + serverSocket.localAddress + ":" + serverSocket.localPort );
  60.         }

  61.         //服务器端向所有客户端发送数据
  62.         private function send( event:Event ):void
  63.         {
  64.             try
  65.             {
  66.                 if (_clients.length == 0)
  67.                                 {
  68.                                         log('没有连接');
  69.                                         return;
  70.                                 }
  71.                                 for (var i:int = 0; i < _clients.length; i++)
  72.                                 {
  73.                                         var item:Socket = _clients[i] as Socket;
  74.                                         if (!item) continue;
  75.                                         item.writeObject(message.text);
  76.                                         item.flush();
  77.                                 }

  78.                                 /*if( clientSocket != null && clientSocket.connected )
  79.                 {
  80.                     clientSocket.writeUTFBytes( message.text );
  81.                     clientSocket.flush();
  82.                     log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
  83.                 }
  84.                 else log("No socket connection.");*/
  85.             }
  86.             catch ( error:Error )
  87.             {
  88.                 log( error.message );
  89.             }
  90.         }

  91.         // 输出日志
  92.         private function log( text:String ):void
  93.         {
  94.             logField.appendText( text + "\n" );
  95.             logField.scrollV = logField.maxScrollV;
  96.             trace( text );
  97.         }

  98.         //设置皮肤
  99.         private function setupUI():void
  100.         {
  101.             localIP = createTextField( 10, 10, "Local IP", "0.0.0.0");
  102.             localPort = createTextField( 10, 35, "Local port", "0" );
  103.             createTextButton( 170, 60, "Bind", bind );
  104.             message = createTextField( 10, 85, "Message", "Lucy can't drink milk." );
  105.             createTextButton( 170, 110, "Send", send );
  106.             logField = createTextField( 10, 135, "Log", "", false, 200 )

  107.             this.stage.nativeWindow.activate();
  108.         }

  109.         private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField
  110.         {
  111.             var labelField:TextField = new TextField();
  112.             labelField.text = label;
  113.             labelField.type = TextFieldType.DYNAMIC;
  114.             labelField.width = 100;
  115.             labelField.x = x;
  116.             labelField.y = y;

  117.             var input:TextField = new TextField();
  118.             input.text = defaultValue;
  119.             input.type = TextFieldType.INPUT;
  120.             input.border = editable;
  121.             input.selectable = editable;
  122.             input.width = 280;
  123.             input.height = height;
  124.             input.x = x + labelField.width;
  125.             input.y = y;

  126.             this.addChild( labelField );
  127.             this.addChild( input );

  128.             return input;
  129.         }

  130.         private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField
  131.         {
  132.             var button:TextField = new TextField();
  133.             button.htmlText = "<u><b>" + label + "</b></u>";
  134.             button.type = TextFieldType.DYNAMIC;
  135.             button.selectable = false;
  136.             button.width = 180;
  137.             button.x = x;
  138.             button.y = y;
  139.             button.addEventListener( MouseEvent.CLICK, clickHandler );

  140.             this.addChild( button );
  141.             return button;
  142.         }        
  143.     }
  144. }
复制代码

客户端代码,主要就是连接服务器端:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.events.MouseEvent;
  6.     import flash.events.ProgressEvent;
  7.     import flash.events.ServerSocketConnectEvent;
  8.     import flash.net.ServerSocket;
  9.     import flash.net.Socket;
  10.     import flash.text.TextField;
  11.     import flash.text.TextFieldType;
  12.     import flash.utils.ByteArray;

  13.     public class MainClient extends Sprite
  14.     {
  15.         private var serverSocket:ServerSocket = new ServerSocket();
  16.         private var clientSocket:Socket;

  17.         private var localIP:TextField;
  18.         private var localPort:TextField;
  19.         private var logField:TextField;
  20.         private var message:TextField;

  21.                 private var _clients:Array = [];

  22.         public function MainClient()
  23.         {
  24.             setupUI();
  25.         }

  26.         private function onConnect( event:Event ):void
  27.         {
  28.             log('成功连接服务器!');
  29.                         //trace('成功连接服务器!!!!');
  30.             //clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
  31.             log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
  32.         }

  33.         private function onClientSocketData( event:ProgressEvent ):void
  34.         {
  35.             var buffer:ByteArray = new ByteArray();
  36.             clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable );
  37.             log( "Received: " + buffer.toString() );
  38.         }

  39.                 public function bind(host:String = "localhost", port:Number = 9080):void
  40.            {
  41.                         log('开始连接服务器!');
  42.                         clientSocket = new Socket( localIP.text, parseInt( localPort.text ));
  43.                         clientSocket.addEventListener(Event.CONNECT, onConnect);//监听连接事件

  44.                 }

  45.         //向服务器发送数据
  46.         private function send( event:Event ):void
  47.         {
  48.             try
  49.             {
  50.                 if( clientSocket != null && clientSocket.connected )
  51.                 {
  52.                     clientSocket.writeUTFBytes( message.text );
  53.                     clientSocket.flush();
  54.                     //log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
  55.                 }
  56.                 else log("No socket connection.");
  57.             }
  58.             catch ( error:Error )
  59.             {
  60.                 log( error.message );
  61.             }
  62.         }

  63.         private function log( text:String ):void
  64.         {
  65.             logField.appendText( text + "\n" );
  66.             logField.scrollV = logField.maxScrollV;
  67.             trace( text );
  68.         }

  69.         private function setupUI():void
  70.         {
  71.             localIP = createTextField( 10, 10, "Local IP", "0.0.0.0");
  72.                         localIP.text = 'localhost';
  73.             localPort = createTextField( 10, 35, "Local port", "0" );
  74.             createTextButton( 170, 60, "Bind", bind );
  75.             message = createTextField( 10, 85, "Message", "Lucy can't drink milk." );
  76.             createTextButton( 170, 110, "Send", send );
  77.             logField = createTextField( 10, 135, "Log", "", false, 200 )

  78.             this.stage.nativeWindow.activate();
  79.         }

  80.         private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField
  81.         {
  82.             var labelField:TextField = new TextField();
  83.             labelField.text = label;
  84.             labelField.type = TextFieldType.DYNAMIC;
  85.             labelField.width = 100;
  86.             labelField.x = x;
  87.             labelField.y = y;

  88.             var input:TextField = new TextField();
  89.             input.text = defaultValue;
  90.             input.type = TextFieldType.INPUT;
  91.             input.border = editable;
  92.             input.selectable = editable;
  93.             input.width = 280;
  94.             input.height = height;
  95.             input.x = x + labelField.width;
  96.             input.y = y;

  97.             this.addChild( labelField );
  98.             this.addChild( input );

  99.             return input;
  100.         }

  101.         private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField
  102.         {
  103.             var button:TextField = new TextField();
  104.             button.htmlText = "<u><b>" + label + "</b></u>";
  105.             button.type = TextFieldType.DYNAMIC;
  106.             button.selectable = false;
  107.             button.width = 180;
  108.             button.x = x;
  109.             button.y = y;
  110.             button.addEventListener( MouseEvent.CLICK, clickHandler );

  111.             this.addChild( button );
  112.             return button;
  113.         }        
  114.     }
  115. }
复制代码



鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

相关分类

返回顶部