[ActionScript 3.0] AS3.0 简单封装Socket的通信
Socket服务器
package com.controls.socket
{
import com.models.events.AppEvent;
import com.models.events.AppEventDispatcher;
import com.models.util.Config; import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.ServerSocketConnectEvent;
import flash.net.ServerSocket;
import flash.net.Socket;
import flash.utils.ByteArray; /**
* @author Frost.Yen
* @email 871979853@qq.com
* @build 2016-8-8 下午8:35:00
*/
public class SocketServer
{
private var _serverSocket:ServerSocket = new ServerSocket();
private var _clients:Array=[];//客户端数组
private var _data:String;
private static var _instance:SocketServer;
public function SocketServer(s:S)
{
}
public static function getInstance():SocketServer
{
if(!_instance){
_instance = new SocketServer(new S());
}
return _instance;
}
/**
* 绑定服务端ip和端口
* @localPort 端口
* @localAddress ip地址
*/
public function bind(localPort:int,localAddress:String):void
{
if( _serverSocket.bound )
{
_serverSocket.close();
_serverSocket = new ServerSocket();
}
_serverSocket.bind( localPort, localAddress);
_serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onConnect );
_serverSocket.addEventListener(Event.CLOSE,onClose);
_serverSocket.listen();
log( "Bound to: " + _serverSocket.localAddress + ":" + _serverSocket.localPort );
}
/**
* 客户端成功连接服务器
*/
private function onConnect( event:ServerSocketConnectEvent):void
{
var clientSocket:Socket = event.socket;
clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
_clients.push(clientSocket);
clientSocket.addEventListener(Event.CLOSE,onCloseClient);
log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
//trace(_clients.length,"_clients.length",Config.clientNum,"Config.clientNum");
if(_clients.length == Config.clientNum){
log("所有客户端连接成功,共"+_clients.length+"台");
AppEventDispatcher.getInstance().dispatchEvent(new AppEvent(AppEvent.CONNECT_SUCCEED));
}
} private function onClose(e:Event):void
{
log( "Connection Faild " );
}
private function onCloseClient(e:Event):void
{
for (var clt:int=0;clt<_clients.length;clt++){
if(_clients[clt].remoteAddress==e.target.remoteAddress&&_clients[clt].remotePort==e.target.remotePort){
var msgObj:Object=_clientDic[_clients[clt].remoteAddress+_clients[clt].remotePort];
delete _clientDic[_clients[clt].remoteAddress+_clients[clt].remotePort];
_clients.splice(clt,1);
if(msgObj){
for each(var clt2:Socket in _clients){
clt2.writeUTFBytes("消息:-----");
clt2.flush();
}
}
msgObj=null; log("\n"+ e.target.remoteAddress+":"+e.target.remotePort+ "断开");
}
} }
/**
* 服务端接收客户端发送的信息
*/
private function onClientSocketData( event:ProgressEvent ):void
{
var buffer:ByteArray = new ByteArray();
var client:Socket = event.currentTarget as Socket;
client.readBytes( buffer, 0, client.bytesAvailable );
_data = buffer.toString();
AppEventDispatcher.getInstance().dispatchEvent(new AppEvent(AppEvent.CLIENT_DATA,buffer));
log( "Received from Client"+ client.remoteAddress + ":" + client.remotePort+"-- " + buffer.toString() );
}
/**
* 服务器向客户端发送信息
*/
public function send(obj:Object):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.writeUTFBytes(JSON.stringify(obj)+"\n");
item.flush();
}
}catch ( error:Error )
{
log( error.message );
}
}
public function log(message:String):void
{
//trace(message);
} public function get data():String
{
return _data;
} }
}
class S{};
Socket客户端
package com.controls
{
import com.models.events.AppEvent;
import com.models.events.AppEventDispatcher; import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.Socket;
import flash.utils.ByteArray; /**
* @author Frost.Yen
* @email 871979853@qq.com
* @build 2016-8-9 下午5:55:19
*/
public class SocketClient
{
private var _client:Socket = new Socket();
private static var _instance:SocketClient;
public function SocketClient(s:S)
{
}
public static function getInstance():SocketClient
{
if(!_instance){
_instance = new SocketClient(new S());
}
return _instance;
}
/**
* 开始连接服务器
* @param host ip地址
* @param port 端口
*/
public function collect(host:String,port:int):void
{
log('开始连接服务器!');
trace(host,port);
_client.connect(host, port);
_client.addEventListener(Event.CONNECT, onConnect);//监听连接事件
_client.addEventListener(IOErrorEvent.IO_ERROR,onError);
_client.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
}
/**
* 连接服务器成功
*/
private function onConnect( event:Event ):void
{
log('成功连接服务器!');
log( "Connection from " + _client.remoteAddress + ":" + _client.remotePort );
}
private function onClientSocketData( event:ProgressEvent):void
{
var buffer:ByteArray = new ByteArray();
_client.readBytes( buffer, 0, _client.bytesAvailable );
log( "Send: " + buffer.toString() );
}
/**
* 接收到服务器发送的数据
*/
private function onSocketData(e:ProgressEvent):void
{
var buffer:String = _client.readUTFBytes(_client.bytesAvailable );
var data:String = buffer.split("\n")[0];
AppEventDispatcher.getInstance().dispatchEvent(new AppEvent(AppEvent.SERVER_DATA,data));
log( "Received from Server:" + buffer );
}
/**
* 向服务端发送数据
* @param msg 数据
*/
private function send(msg:String):void
{
try
{
if( _client != null && _client.connected )
{
_client.writeUTFBytes(msg);
_client.flush();
//log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
}
else log("No socket connection.");
}
catch ( error:Error )
{
log( error.message );
}
}
private function onError(e:IOErrorEvent):void
{
log(e.toString());
}
public function log(message:String):void
{
//trace(message);
} }
}
class S{};
代码中的导入的类:
import com.models.events.AppEvent;
import com.models.events.AppEventDispatcher;
是用于接收到数据后向外派发事件时所用,可自行处理。
[ActionScript 3.0] AS3.0 简单封装Socket的通信的更多相关文章
- [ActionScript 3.0] AS3.0和AS2.0的相互通信
AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...
- [ActionScript 3.0] AS3.0 让一个视频无缝循环播放的一个偏方
一个视频要循环播放,通常的办法都是播放完后再重新播放,但是不可避免的播放结束和重新开始播放这个时间点上会有停顿,如何解决这个问题,说个偏方吧! package com.views { import f ...
- [ActionScript 3.0] AS3.0 下雨及涟漪效果
帧代码: stage.frameRate = 80; function init(x1:Number,y1:Number) { var mc:MovieClip=new MovieClip(); ad ...
- [ActionScript 3.0] AS3.0 Socket通信实例
以下类是充当Socket服务器的例子 package { import flash.display.Sprite; import flash.events.Event; import flash.ev ...
- [ActionScript 3.0] AS3.0 本机鼠标指针
Flash Player 10.2添加了内置的本机鼠标指针(native mouse cursor)支持,虽然在之前的版本里我们可以侦听MouseEvent事件来模拟鼠标指针,但是在有了原生的本机鼠标 ...
- [ActionScript 3.0] AS3.0 动态加载显示内容
可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...
- [ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMo ...
- [ActionScript 3.0] AS3.0 对象在矩形范围随机运动
package com.views { import flash.display.Bitmap; import flash.display.MovieClip; import flash.displa ...
- [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)
import flash.display.BitmapData; import flash.display.Bitmap; /** * 将图像的Alpha通道转换为黑白图像(分离ARGB方式) */ ...
随机推荐
- iOS开发拓展篇—音频处理(音乐播放器5)
iOS开发拓展篇—音频处理(音乐播放器5) 实现效果: 一.半透明滑块的设置 /** *拖动滑块 */ - (IBAction)panSlider:(UIPanGestureRecognizer *) ...
- 怎样将Sqlserver数据库转成mysql数据库
手上有一个网站之前是用asp.net做的,所使用的数据库是sqlserver,现在打算用PHP+MYSQL架构.因原来的站点有一定排名,直接改版的话,会导致产生很多错误页,网站排名和收录结果要恢复过来 ...
- cocos2d-x 系列文章介绍
学习 cocos2d-x 一年多,从3.0bata 到 现在的 3.6 ,从最早没什么教程到现在官网繁多的资料教程, cocos2d-x 的变化实在是大.刚开始学习 cocos2d-x 是到处找资 ...
- U盘格式化后的恢复
软件:http://www.easeus.com/datarecoverywizard/free-data-recovery-software.htm
- 关于jsonp跨域过程中 cookie中的值一直为null的原因
今天技术交流群里的小伙伴一直被一个问题而困扰,就是写入cookie里面的值 再次进行请求时 cookie 就为空了 他被问题纠结了一天 我也好奇了一天 终于在快下班的时候 他解决掉了 下面我来收一个 ...
- iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档
iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...
- SCC(强连通分量)
1.定义: 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(SC---strongly connected). 有向图中的极大强连通子图,成为强连通分量(SCC---strongly ...
- bigworld源码分析(1)—— 研究bigworld的意义和目标
对于网络游戏服务器开发熟悉的人,基本都知道bigworld引擎,此引擎包括客户端部分和服务器部分,已经有很多知名的网络游戏通过bigworld来构建游戏.我主要关注bigworld的服务器部分,它是一 ...
- [翻译]lpeg入门教程
原文地址:http://lua-users.org/wiki/LpegTutorial 简单匹配 LPeg是一个用于文本匹配的有力表达方式,比Lua原生的字符串匹配和标准正则表达式更优异.但是,就像其 ...
- SPARQL1.1 101 Language and Jena support
1 introduction definition cited from SPARQL 1.1 Overview: SPARQL 1.1 is a set of specifications that ...