前两天,同事问Flash是否能为实现监测本地端口(socket)?这个问题之前还真没认真了解过,只知道flash有个Socket和XMLSocket来实现连接到Socket服务器,而且flash无法直接访问到本地文件。在网上搜索了下,发现flash.net包中有个ServerSocket类,在API文档是这样描述的:

     1、 ServerSocket 类允许代码充当传输控制协议 (TCP) 连接的服务器。
     2、 AIR 配置文件支持: 所有桌面操作系统、iOS(自 AIR 3.8 起)和Android(自 AIR 3.8 起)均支持此功能。AIR for TV 设备不支持此功能。您可以使用  ServerSocket.isSupported  属性在运行时测试是否受支持。
     3、 TCP 服务器侦听来自远程客户端的传入连接。当客户端尝试连接时,ServerSocket 将调度  connect  事件。为此事件调度的 ServerSocketConnectEvent 对象提供了表示服务器和客户端之间 TCP 连接的 Socket 对象。将此 Socket 对象用于与连接的客户端的后续通信。如果需要,您可以从 Socket 对象获取客户端地址和端口。
     4、 要使 ServerSocket 对象进入侦听状态,请调用  listen()  方法。在侦听状态下,每当使用 TCP 协议的客户端尝试连接到绑定地址和端口时,服务器 Socket 对象将调度  connect  事件。在调用  close()  方法之前,ServerSocket 对象将继续侦听其他连接。
     5、 ServerSocket 类仅可在 Adobe AIR 应用程序和应用程序安全沙箱中使用。
     根据描述,Flash是可以实现的,但只能用AIR来实现,因为AIR 具有操作系统的能力。     
    下面是服务端和客户端连接的例子:

    服务端ServerSocket的代码:
    
  
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
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.TextFieldAutoSize;
import flash.text.TextFieldType;
public class ServerSocketExample extends Sprite
{
private var ipLblTf:TextField;
private var ipTf:TextField; //监听ip输入框
private var portLblTf:TextField;
private var portTf:TextField;//监听端口输入框、
private var connectBtn:Sprite;
private var serverSocket:ServerSocket;
private var logTf:TextField;
private var socketList:Vector.<Socket>;
private var input:TextField;
private var sendBtn:Button;
public function ServerSocketExample()
{
this.stage.align = StageAlign.LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
initUI();
socketList = new Vector.<Socket>();
}
private function initUI():void
{
ipLblTf = createLable("侦听本地的IP地址:",0,0);
portLblTf = createLable("侦听的端口:",0,40);
ipTf = createInputText(100,30,150,0,"127.0.0.1");
portTf = createInputText(100,30,150,40,"0");
connectBtn = new Button("绑定",100,30);
connectBtn.y = 100;
logTf = createInputText(254,100,0,150,"");
logTf.type = TextFieldType.DYNAMIC;
input = createInputText(195,30,logTf.x,logTf.y+logTf.height+10,"");
sendBtn = new Button("发送",50,30);
sendBtn.x = input.x+input.width+10;
sendBtn.y = input.y;
this.addChild(ipLblTf);
this.addChild(portLblTf);
this.addChild(ipTf);
this.addChild(portTf);
this.addChild(connectBtn);
this.addChild(logTf);
this.addChild(input);
this.addChild(sendBtn);
connectBtn.addEventListener(MouseEvent.CLICK,onConnectClick);
sendBtn.addEventListener(MouseEvent.CLICK,onSendClick);
}
private function onConnectClick(e:MouseEvent):void
{
/**套接字是否为null或绑定到本地地址和端口*/
if( serverSocket == null ||serverSocket.bound )
{
/**关闭套接字并停止侦听连接*/
if(serverSocket != null)
serverSocket.close();
serverSocket = new ServerSocket();
}
/**将此套接字绑定到指定的本地地址和端口。*/
try
{
trace("侦听ip:"+ipTf.text,"端口:"+portTf.text);
serverSocket.bind( parseInt( portTf.text ), ipTf.text );
}
catch(error:Error)
{
trace(error);
trace(error.message);
log(error.message);
}
/**远程套接字Socket连接到ServerSocket时调度*/
serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onServerSocketConnect );
/**侦听绑定的 IP 地址和端口上的 TCP 连接*/
serverSocket.listen();
log("服务器正在侦听"+ipTf.text+"端口"+portTf.text);
}
/**
* 获得连接到该服务端的socket引用
* @param e
*
*/
private function onServerSocketConnect(e:ServerSocketConnectEvent):void
{
var socket:Socket = e.socket;
if(socket!=null)
{
socketList.push(socket);
socket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
socket.addEventListener(Event.CLOSE,onClientSocketClose);
log( "客户端连接地址 " + socket.remoteAddress + ":" + socket.remotePort );
}
}
/**
* 接收socket端发送的数据
* @param e
*
*/
private function onClientSocketData(e:ProgressEvent):void
{
var socket:Socket = e.currentTarget as Socket;
if(socket !=null && socket.bytesAvailable)
{
log( "接收客户端" + socket.remoteAddress + ":" + socket.remotePort+"的消息:"+socket.readUTF());
}
}
private function onClientSocketClose(e:Event):void
{
var socket:Socket = e.currentTarget as Socket;
removeSocket(socket);
}
private function onSendClick(e:MouseEvent):void
{
sendMessage(input.text);
}
/**
* 移除已断开连接的socket引用
* @param socket
*
*/
private function removeSocket(socket:Socket):void
{
if(socket != null)
{
var index:int = socketList.indexOf(socket);
if(index >-1)
{
socketList.splice(index,1);
}
socket.removeEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
socket.removeEventListener(Event.CLOSE,onClientSocketClose);
log( "客户端" + socket.remoteAddress + ":" + socket.remotePort+"已关闭");
}
}
/**
*发送消息到连接到该服务端的socket连接
* @param msg 消息
*
*/
private function sendMessage(msg:String):void
{
try
{
var flag:Boolean = false;
for each(var so:Socket in socketList)
{
if(so != null && so.connected)
{
so.writeUTF(msg);
so.flush();
log( "已发送消息到: " + so.remoteAddress + ":" + so.remotePort );
flag = true;
}
}
if(!flag)
{
log("没有Socket连接");
}
}
catch ( error:Error )
{
log( error.message );
}
}
private function log(text:String):void
{
logTf.appendText( text + "\n" );
logTf.scrollV = logTf.maxScrollV;
}
/**
* 创建标签
* @param lable
* @param x
* @param y
* @return
*
*/
private function createLable(lable:String,x:Number,y:Number):TextField
{
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = lable;
tf.x = x;
tf.y = y;
return tf;
}
/**
* 创建输入文本框
* @param width
* @param height
* @param x
* @param y
* @return
*
*/
private function createInputText(width:Number,height:Number,x:Number,y:Number,text:String):TextField
{
var inputTf:TextField = new TextField();
inputTf.width = width;
inputTf.height = height;
inputTf.border = true;
inputTf.type = TextFieldType.INPUT;
inputTf.text = text;
inputTf.x = x;
inputTf.y = y;
return inputTf;
}
}
}

客户端Socket的代码:
   
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.Socket;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
public class SocketExamplet extends Sprite
{
private var ipLblTf:TextField;
private var ipTf:TextField; //监听ip输入框
private var portLblTf:TextField;
private var portTf:TextField;//监听端口输入框、
private var connectBtn:Sprite;
private var socket:Socket;
private var logTf:TextField;
private var input:TextField;
private var sendBtn:Button;
public function SocketExamplet()
{
this.stage.align = StageAlign.LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
initUI();
}
private function initUI():void
{
ipLblTf = createLable("侦听本地的IP地址:",0,0);
portLblTf = createLable("侦听的端口:",0,40);
ipTf = createInputText(100,30,150,0,"127.0.0.1");
portTf = createInputText(100,30,150,40,"0");
connectBtn = new Button("绑定",100,30);
connectBtn.y = 100;
logTf = createInputText(254,100,0,150,"");
logTf.type = TextFieldType.DYNAMIC;
input = createInputText(195,30,logTf.x,logTf.y+logTf.height+10,"");
sendBtn = new Button("发送",50,30);
sendBtn.x = input.x+input.width+10;
sendBtn.y = input.y;
this.addChild(ipLblTf);
this.addChild(portLblTf);
this.addChild(ipTf);
this.addChild(portTf);
this.addChild(connectBtn);
this.addChild(logTf);
this.addChild(input);
this.addChild(sendBtn);
connectBtn.addEventListener(MouseEvent.CLICK,onConnectClick);
sendBtn.addEventListener(MouseEvent.CLICK,onSendClick);
}
private function onConnectClick(e:MouseEvent):void
{
socket = new Socket();
try
{
/**连接事件侦听,在建立网络连接后调度,仅在服务器关闭连接时调度 close 事件;
* 在调用 Socket.close() 方法时不调度该事件。
* */
socket.addEventListener(Event.CONNECT,onConnect);
/**获得socket数据事件侦听,在套接字接收到数据后调度*/
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
/**关闭socket连接事件侦听*/
socket.addEventListener(Event.CLOSE,onClose);
/**
* 若对 Socket.connect() 的调用尝试连接到调用方的安全沙箱禁止的服务器或低于 1024 的端口,
* 且不存在允许进行此类连接的套接字策略文件,则进行调度。
* */
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);//
socket.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
socket.connect(ipTf.text,parseInt(portTf.text));
}
catch(error:Error)
{
log(error.message);
}
}
private function onSendClick(e:MouseEvent):void
{
socket.writeUTF(input.text);
socket.flush();
log( "已发送消息到服务端: " + socket.remoteAddress + ":" + socket.remotePort );
}
private function onConnect(e:Event):void
{
log("已连接到远程服务器"+ipTf.text+"端口"+portTf.text);
}
private function onSocketData(e:ProgressEvent):void
{
if(socket.bytesAvailable)
{
log("接收的数据:"+socket.readUTF());
}
}
private function onSecurityError(e:SecurityErrorEvent):void
{
log(e.text);
}
private function onIOError(e:IOErrorEvent):void
{
log(e.text);
}
private function onClose(e:Event):void
{
log("连接已关闭");
}
private function log(text:String):void
{
logTf.appendText( text + "\n" );
logTf.scrollV = logTf.maxScrollV;
}
/**
* 创建标签
* @param lable
* @param x
* @param y
* @return
*
*/
private function createLable(lable:String,x:Number,y:Number):TextField
{
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = lable;
tf.x = x;
tf.y = y;
return tf;
}
/**
* 创建输入文本框
* @param width
* @param height
* @param x
* @param y
* @return
*
*/
private function createInputText(width:Number,height:Number,x:Number,y:Number,text:String):TextField
{
var inputTf:TextField = new TextField();
inputTf.width = width;
inputTf.height = height;
inputTf.border = true;
inputTf.type = TextFieldType.INPUT;
inputTf.text = text;
inputTf.x = x;
inputTf.y = y;
return inputTf;
}
}
}

AIR Socket服务器的实现相关推荐

  1. [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器

    原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...

  2. php运行socket服务器,PHP_php简单socket服务器客户端代码实例,本篇文章分享一个简单的socket - phpStudy...

    php简单socket服务器客户端代码实例 本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 /*文 ...

  3. ActionScript接收socket服务器发送来的数据

    原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...

  4. 210130阶段三socket服务器

    目录 一.学习的知识点 基于socket服务器 socket函数 bind函数 listen函数 accept函数 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 每个上网的 ...

  5. php后端如何搭建socket服务,从php做一个简单的socket服务器流程

    socket的中文名字称为套接字,这类物品就是说对TCP/iP的"封裝".实际中的互联网事实上只能四层罢了,从上至下分別是网络层.传输层.网络层.统计数据链路层.最常见的.com协 ...

  6. 以C#编写的Socket服务器的Android手机聊天室Demo

      内容摘要 1.程序架构    2.通信协议    3.服务器源代码    4.客户端源代码    5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.W ...

  7. github开源推荐:SuperSocket, 可扩展的 Socket 服务器框架

    1.简介 SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket ...

  8. SuperSocket 2.0 Preview1 发布,.NET Socket服务器框架

    今天,SuperSocket的作者发布了2.0版本的第一个预览版.SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本.作者正在积极尝试提供更简单易用的API的 ...

  9. php soecket服务器搭建_PHP socket 服务器框架集

    1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时 ...

最新文章

  1. 日期如何比较 java_如何比较Java中的日期?
  2. klee错误汇报二:KLEE的optimize选项的一个困惑
  3. 我在北京大学,剑桥大学读的书
  4. Spring MVC-06循序渐进之Converter和Formatter
  5. 管理 Active Directory 所必需的工具或技术
  6. nginx修改监听端口号8080_Nginx + Tomcat 配置
  7. MOOC数学建模与实验---学习笔记---整理汇总表
  8. 深度学习(三)转-可视化理解卷积神经网络 直接查看卷积神经网络的过程特征...
  9. RabbitMQ教程C#版 “Hello World”
  10. 子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)
  11. linux 下i2c读写命令,S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作
  12. 微信小程序上传大于4m_微信定制小程序开发
  13. php 实现二叉树的最大深度_python实现二叉树的遍历以及其他基本操作
  14. CentOS下安装实时检测网络带宽的小工具bmon
  15. spark原理和spark与mapreduce的最大区别
  16. 【备忘录】word利用mathtype进行公式分章节编号和引用
  17. 使用Areas分离ASP.NET MVC项目
  18. Unity3D加载资源的四种方式
  19. verilog实现三人表决器
  20. 《增强现实:融合现实与虚拟世界》

热门文章

  1. 使用非对称加密加强JWT验证
  2. 计算机基础中原工学院,中原工学院第十四届计算机基本技能大赛圆满落幕
  3. Android版仿微信朋友圈图片拖拽返回效果,websocketapp保活
  4. 【微信小程序控制硬件 第13篇】安信可B站直播学习总结,微信小程序MQTT远程控制ESP8266 NodeMCU,谈谈微信生态那些事;
  5. [Mac 基础知识]:用Time Machine 恢复mac系统
  6. java答题软件_Java程序设计:使用软件解题
  7. gitee.com 新建仓库及使用的步骤
  8. Reflex WMS for Factory:服务于工业4.0的物流管理软件
  9. 海外版抖音TikTok实战,30天增粉45w+?
  10. [附源码]计算机毕业设计springboot本地助农产品销售系统