AIR Socket服务器的实现
前两天,同事问Flash是否能为实现监测本地端口(socket)?这个问题之前还真没认真了解过,只知道flash有个Socket和XMLSocket来实现连接到Socket服务器,而且flash无法直接访问到本地文件。在网上搜索了下,发现flash.net包中有个ServerSocket类,在API文档是这样描述的:
ServerSocket.isSupported
属性在运行时测试是否受支持。
connect
事件。为此事件调度的 ServerSocketConnectEvent 对象提供了表示服务器和客户端之间 TCP 连接的 Socket 对象。将此 Socket 对象用于与连接的客户端的后续通信。如果需要,您可以从 Socket 对象获取客户端地址和端口。
listen()
方法。在侦听状态下,每当使用 TCP 协议的客户端尝试连接到绑定地址和端口时,服务器 Socket 对象将调度 connect
事件。在调用 close()
方法之前,ServerSocket 对象将继续侦听其他连接。
![](/assets/blank.gif)
![](/assets/blank.gif)
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;
}
}
}
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服务器的实现相关推荐
- [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器
原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...
- php运行socket服务器,PHP_php简单socket服务器客户端代码实例,本篇文章分享一个简单的socket - phpStudy...
php简单socket服务器客户端代码实例 本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 /*文 ...
- ActionScript接收socket服务器发送来的数据
原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...
- 210130阶段三socket服务器
目录 一.学习的知识点 基于socket服务器 socket函数 bind函数 listen函数 accept函数 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 每个上网的 ...
- php后端如何搭建socket服务,从php做一个简单的socket服务器流程
socket的中文名字称为套接字,这类物品就是说对TCP/iP的"封裝".实际中的互联网事实上只能四层罢了,从上至下分別是网络层.传输层.网络层.统计数据链路层.最常见的.com协 ...
- 以C#编写的Socket服务器的Android手机聊天室Demo
内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.W ...
- github开源推荐:SuperSocket, 可扩展的 Socket 服务器框架
1.简介 SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket ...
- SuperSocket 2.0 Preview1 发布,.NET Socket服务器框架
今天,SuperSocket的作者发布了2.0版本的第一个预览版.SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本.作者正在积极尝试提供更简单易用的API的 ...
- php soecket服务器搭建_PHP socket 服务器框架集
1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时 ...
最新文章
- 日期如何比较 java_如何比较Java中的日期?
- klee错误汇报二:KLEE的optimize选项的一个困惑
- 我在北京大学,剑桥大学读的书
- Spring MVC-06循序渐进之Converter和Formatter
- 管理 Active Directory 所必需的工具或技术
- nginx修改监听端口号8080_Nginx + Tomcat 配置
- MOOC数学建模与实验---学习笔记---整理汇总表
- 深度学习(三)转-可视化理解卷积神经网络 直接查看卷积神经网络的过程特征...
- RabbitMQ教程C#版 “Hello World”
- 子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)
- linux 下i2c读写命令,S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作
- 微信小程序上传大于4m_微信定制小程序开发
- php 实现二叉树的最大深度_python实现二叉树的遍历以及其他基本操作
- CentOS下安装实时检测网络带宽的小工具bmon
- spark原理和spark与mapreduce的最大区别
- 【备忘录】word利用mathtype进行公式分章节编号和引用
- 使用Areas分离ASP.NET MVC项目
- Unity3D加载资源的四种方式
- verilog实现三人表决器
- 《增强现实:融合现实与虚拟世界》
热门文章
- 使用非对称加密加强JWT验证
- 计算机基础中原工学院,中原工学院第十四届计算机基本技能大赛圆满落幕
- Android版仿微信朋友圈图片拖拽返回效果,websocketapp保活
- 【微信小程序控制硬件 第13篇】安信可B站直播学习总结,微信小程序MQTT远程控制ESP8266 NodeMCU,谈谈微信生态那些事;
- [Mac 基础知识]:用Time Machine 恢复mac系统
- java答题软件_Java程序设计:使用软件解题
- gitee.com 新建仓库及使用的步骤
- Reflex WMS for Factory:服务于工业4.0的物流管理软件
- 海外版抖音TikTok实战,30天增粉45w+?
- [附源码]计算机毕业设计springboot本地助农产品销售系统