自:http://luoke920.iteye.com/blog/1161549

新的air sdk 新增了 ServerSocket类, 利用它我们做一些简单的局域网应用,比如小型的办公聊天软件,以及一些基于socket的服务应用.这样as程序员可以自己搞定服务器端,不在去求于 java程序员.在一下大型应用还没有尝试过.期待有人能做一下大型应用的尝试.小型的办公应用足够能满足了.

首先看服务器端代码:

?View Code ACTIONSCRIPT
package
{import flash.display.Sprite;import flash.events.Event;import flash.events.MouseEvent;import flash.events.ProgressEvent;import flash.events.ServerSocketConnectEvent;import flash.net.ServerSocket;import flash.net.Socket;import flash.text.TextField;import flash.text.TextFieldType;import flash.utils.ByteArray;public class Main extends Sprite{private var serverSocket:ServerSocket = new ServerSocket();private var clientSocket:Socket;private var localIP:TextField;private var localPort:TextField;private var logField:TextField;private var message:TextField;private var _clients:Array = [];public function Main(){setupUI();}//当客户端成功连接服务端private function onConnect( event:ServerSocketConnectEvent):void{clientSocket = event.socket;clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );_clients.push(clientSocket);log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );}//当有数据通信时private function onClientSocketData( event:ProgressEvent ):void{var buffer:ByteArray = new ByteArray();clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable );log( "Received: " + buffer.toString() );for (var i:int = 0; i < _clients.length; i++) {var item:Socket = _clients[i] as Socket;if (!item) continue;item.writeObject(buffer.toString());item.flush();}}//绑定服务器ip 开始监听端口private function bind( event:Event ):void{if( serverSocket.bound ) {serverSocket.close();serverSocket = new ServerSocket();}serverSocket.bind( parseInt( localPort.text ), localIP.text );serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onConnect );serverSocket.listen();log( "Bound to: " + serverSocket.localAddress + ":" + serverSocket.localPort );}//服务器端向所有客户端发送数据private function send( event:Event ):void{try{if (_clients.length == 0){log('没有连接');return;}for (var i:int = 0; i < _clients.length; i++) {var item:Socket = _clients[i] as Socket;if (!item) continue;item.writeObject(message.text);item.flush();}/*if( clientSocket != null && clientSocket.connected ){clientSocket.writeUTFBytes( message.text );clientSocket.flush(); log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );}else log("No socket connection.");*/}catch ( error:Error ){log( error.message );}}// 输出日志private function log( text:String ):void{logField.appendText( text + "\n" );logField.scrollV = logField.maxScrollV;trace( text );}//设置皮肤private function setupUI():void{localIP = createTextField( 10, 10, "Local IP", "0.0.0.0");localPort = createTextField( 10, 35, "Local port", "0" );createTextButton( 170, 60, "Bind", bind );message = createTextField( 10, 85, "Message", "Lucy can't drink milk." );createTextButton( 170, 110, "Send", send );logField = createTextField( 10, 135, "Log", "", false, 200 )this.stage.nativeWindow.activate();}private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField{var labelField:TextField = new TextField();labelField.text = label;labelField.type = TextFieldType.DYNAMIC;labelField.width = 100;labelField.x = x;labelField.y = y;var input:TextField = new TextField();input.text = defaultValue;input.type = TextFieldType.INPUT;input.border = editable;input.selectable = editable;input.width = 280;input.height = height;input.x = x + labelField.width;input.y = y;this.addChild( labelField );this.addChild( input );return input;}private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField{var button:TextField = new TextField();button.htmlText = "<u><b>" + label + "</b></u>";button.type = TextFieldType.DYNAMIC;button.selectable = false;button.width = 180;button.x = x;button.y = y;button.addEventListener( MouseEvent.CLICK, clickHandler );this.addChild( button );return button;}        }
}

客户端代码,主要就是连接服务器端:

?View Code ACTIONSCRIPT
package
{import flash.display.Sprite;import flash.events.Event;import flash.events.MouseEvent;import flash.events.ProgressEvent;import flash.events.ServerSocketConnectEvent;import flash.net.ServerSocket;import flash.net.Socket;import flash.text.TextField;import flash.text.TextFieldType;import flash.utils.ByteArray;public class MainClient extends Sprite{private var serverSocket:ServerSocket = new ServerSocket();private var clientSocket:Socket;private var localIP:TextField;private var localPort:TextField;private var logField:TextField;private var message:TextField;private var _clients:Array = [];public function MainClient(){setupUI();}private function onConnect( event:Event ):void{log('成功连接服务器!');//trace('成功连接服务器!!!!');//clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );}private function onClientSocketData( event:ProgressEvent ):void{var buffer:ByteArray = new ByteArray();clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable );log( "Received: " + buffer.toString() );}public function bind(host:String = "localhost", port:Number = 9080):void{log('开始连接服务器!');clientSocket = new Socket( localIP.text, parseInt( localPort.text ));clientSocket.addEventListener(Event.CONNECT, onConnect);//监听连接事件}//向服务器发送数据private function send( event:Event ):void{try{if( clientSocket != null && clientSocket.connected ){clientSocket.writeUTFBytes( message.text );clientSocket.flush(); //log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );}else log("No socket connection.");}catch ( error:Error ){log( error.message );}}private function log( text:String ):void{logField.appendText( text + "\n" );logField.scrollV = logField.maxScrollV;trace( text );}private function setupUI():void{localIP = createTextField( 10, 10, "Local IP", "0.0.0.0");localIP.text = 'localhost';localPort = createTextField( 10, 35, "Local port", "0" );createTextButton( 170, 60, "Bind", bind );message = createTextField( 10, 85, "Message", "Lucy can't drink milk." );createTextButton( 170, 110, "Send", send );logField = createTextField( 10, 135, "Log", "", false, 200 )this.stage.nativeWindow.activate();}private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField{var labelField:TextField = new TextField();labelField.text = label;labelField.type = TextFieldType.DYNAMIC;labelField.width = 100;labelField.x = x;labelField.y = y;var input:TextField = new TextField();input.text = defaultValue;input.type = TextFieldType.INPUT;input.border = editable;input.selectable = editable;input.width = 280;input.height = height;input.x = x + labelField.width;input.y = y;this.addChild( labelField );this.addChild( input );return input;}private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField{var button:TextField = new TextField();button.htmlText = "<u><b>" + label + "</b></u>";button.type = TextFieldType.DYNAMIC;button.selectable = false;button.width = 180;button.x = x;button.y = y;button.addEventListener( MouseEvent.CLICK, clickHandler );this.addChild( button );return button;}        }
}

整体实现起来比较简单, 服务器端可以做分发. 如果做个聊天室也非常容易. 期待air的效率能再提高一些.

转载于:https://www.cnblogs.com/wonderKK/archive/2013/03/20/2970930.html

(转)利用AIR的ServerSocket类让 AIR 做socket服务器相关推荐

  1. adobe air管理员_了解Adobe AIR,第二部分:构建客户管理应用

    adobe air管理员 In our previous tutorial, we created a personal notes storage database using HTML, CSS, ...

  2. AIR Socket服务器的实现

    前两天,同事问Flash是否能为实现监测本地端口(socket)?这个问题之前还真没认真了解过,只知道flash有个Socket和XMLSocket来实现连接到Socket服务器,而且flash无法直 ...

  3. adobe air 工程师_使用Adobe AIR将CSS带到桌面!

    adobe air 工程师 So, I've been issued a challenge at SitePoint to develop a piece of software in order ...

  4. adobe air 工程师_了解Adobe AIR,第I部分:构建Note存储应用

    adobe air 工程师 The Adobe Integrated Runtime (AIR) platform changes the game for web developers, takin ...

  5. 开发使用air还是pro_新款iPad Air首发评测:比“Pro”更轻量的无负担体验

    在很多人眼中,iPad是一个非常神奇的设备.最初的它,通过大屏幕和轻薄便携的机身,成为很多人眼中的娱乐工具,现在,基于强大的性能和丰富的配件,iPad也由最初的娱乐影音工具进化为生产力工具.尤其是iP ...

  6. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  7. nearbyserversocket驱动_关于Socket和ServerSocket类详解

    Socket类 套接字是网络连接的一个端点.套接字使得一个应用可以从网络中读取和写入数据.放在两个不同计算机上的两个应用可以通过连接发送和接受字节流.为了从你的应用发送一条信息到另一个应用,你需要知道 ...

  8. 利用java反射调用类的的私有方法

    http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...

  9. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

最新文章

  1. C# 读取Excel中的时间
  2. Matlab读取txt文件中的数据(使用textread函数)
  3. c++ smart pointer 趣谈
  4. 如何查看linux下串口信息
  5. Jetbrains全系列完美破解--------亲测可用
  6. Python_XlrdXlwt
  7. 简单解释 MapReduce 算法
  8. INSTALL_FAILED_VERSION_DOWNGRADE报错
  9. Bootstrap table列内容过长,显示固定长度,超过内容隐藏
  10. PHP 删除文件,文件下的目录
  11. VLAN与trunk配置 实验 思科模拟器Cisco
  12. OpenStack 对接 Ceph
  13. 万物可运算——运算符重载(四)
  14. 怎么快速解决dns被劫持问题?
  15. 虚拟化做快照需要停服务器么,如何创建VMware虚拟化快照和快照删除的方法
  16. Uploadifive上传
  17. Revit API 2018调试闪退
  18. 浏览器基础(2)-跨域
  19. 【spark使用】4. Dataset转换算子使用
  20. 抖音一个好的标题让你轻松上热门,该怎么写好抖音标题。

热门文章

  1. 使用emacs去除源代码中多余的空格
  2. 【Elasticsearch】用ElasticSearch实现基于标签的兴趣推荐
  3. 【ElasticSearch】Es 源码之 Discovery DiscoveryModule 源码解读
  4. 【Zookeeper】基于Zookeeper实现分布式锁
  5. 【clickhouse】ClickHouse 在实时场景的应用和优化-字节跳动技术沙龙第6期 笔记
  6. spark学习-58-Spark的EventLoggingListener
  7. 95-120-042-源码-Cluster-SessionClusterEntrypoint
  8. 95-180-050-源码-Watermark-允许固定数量延迟的分配器(BoundedOutOfOrdernessTimestampExtractor)
  9. 95-280-038-源码-资源管理-计算资源管理-TaskSlot-JobManager 中 Slot 的管理
  10. 【Flink】分布式快照算法—— Chandy-Lamport 算法