封装自己的Flex工具_SocketTool
Flex的sdk中已经有Socket类,虽然用起来比较方便,但真正的项目用起来未免有些繁琐了,所以我们有必要对其进行必要的改造下,让Socket更灵敏,更好用!
Flex的Socket可以向其写入Object,本次的工具着重完成写入Object,并且读取SocketServer返回的Object!
1.创建class,SocketTool
public class SocketTool{}
2.为SocketTool添加socket:Socket属性并注册好一些默认的事件监听,将来就靠此属性来完成通信任务!
添加bytes:ByteArray属性,用于将来解压从服务器获取到的字节,之后将解压后的字节读取为Object
再次添加2个状态属性,
_usable,辨别socket是否可以用,
_status,存放socket的状态信息
public class SocketTool
{
private var socket:Socket = new Socket();
private var bytes:ByteArray;
private var byteArrayTool:ByteArrayTool = new ByteArrayTool();
private var _usable:Boolean = false;
private var _statusInfo:String = "状态未知";
public function SocketTool(host:String,port:uint)
{
socket.connect(host,port);
socket.addEventListener(Event.CLOSE,onClose);
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
socket.addEventListener(Event.CONNECT,onConn);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
socket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
}
//默认 事件
private function onClose(e:Event){
usable = false;
statusInfo = "Socket关闭";
trace("Socket Already Closed");
}
private function onSocketData(e:ProgressEvent){
if(socket.bytesAvailable){
var r:String = socket.readMultiByte(socket.bytesAvailable,"gbk");
usable=true;
statusInfo = "Socket可用";
trace("Receive Server's Data"+r);
}
}
private function onConn(e:Event){
trace("Socket connect complete");
statusInfo = "获取安全信息,Socket不可用";
sendTestInfo();
function sendTestInfo(){
socket.writeMultiByte("<policy-file-request/>","gbk");
socket.flush();
}
}
private function onSecurityError(e:SecurityErrorEvent){
usable = false;
statusInfo = "安全错误,Socket不可用";
trace("SecurityError,check Server's [Cross Domain]");
}
private function onIoError(e:IOErrorEvent){
usable = false;
statusInfo = "io错误,Socket不可用";
trace("IoError");
}
//----
public function get statusInfo():String{
return _statusInfo;
}
public function set statusInfo(_statusInfo:String){
this._statusInfo = _statusInfo;
}
public function get usable():Boolean{
return _usable;
}
public function set usable(_usable:Boolean):void{
this._usable = _usable;
}
//关闭事件
public function addCloseEvent(closeHandler:Function):void{
removeCloseEvent(closeHandler);
socket.addEventListener(Event.CLOSE,closeHandler);
}
public function removeCloseEvent(closeHandler:Function):void{
socket.removeEventListener(Event.CLOSE,closeHandler);
}
//连接ok事件
public function addConnectEvent(connHandler:Function):void{
removeConnectEvent(connHandler);
socket.addEventListener(Event.CONNECT,connHandler);
}
public function removeConnectEvent(closeHandler:Function):void{
socket.removeEventListener(Event.CONNECT,closeHandler);
}
//安全失败事件
public function addSecurityErrorEvent(securityHandler:Function):void{
removeSecurityErrorEvent(securityHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityHandler);
}
public function removeSecurityErrorEvent(securityHandler:Function):void{
socket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,securityHandler);
}
//io error
public function addIoErrorEvent(ioHandler:Function):void{
removeIoErrorEvent(ioHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR,ioHandler);
}
public function removeIoErrorEvent(ioHandler:Function):void{
socket.removeEventListener(IOErrorEvent.IO_ERROR,ioHandler);
}
//收到 数据事件
public function addSocketDataEvent(socketDataHandler:Function):void{
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
function circle(e:TimerEvent){
if(usable){
removeSocketDataEvent(onSocketData); //移除默认事件
socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
statusInfo = "Socket已可用";
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
}
public function removeSocketDataEvent(socketDataHandler:Function):void{
socket.removeEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
}
//添加上connect方法,便于将来再次连接服务器
//连接服务器
public function connect(host:String,port:uint){
socket.connect(host,port);
}
ok,到目前为止,初始化的任务完成,重要的方法就要开始.
任务1.让socket发送Object,如果服务器响应了,触发某个回调
/**
* 通过回调方式完成一次发送与接收
* @send:要发送的对象
* @compress:是否要将发送对象压缩
* @receiverHandler: 接收的回调
* */
public function sendAndReceive(send:Object,receiverHandler:Function,compress:Boolean=false):void{
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
function circle(e:TimerEvent){
if(usable){
writeObject(send,compress);
addSocketDataEvent(receiverHandler);
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
}
任务2.让socket发送Object,如果服务器响应了,触发回调,并且将服务器返回的Object放入回调
/**
* 通过回调方式完成一次发送对象与接收对象
* @send:要发送的对象
* @compress:是否要将发送对象压缩
* @receiverObjectHandler: 接收对象的回调
* */
public function sendAndReceiverObject(send:Object,receiverObjectHandler:Function,compress:Boolean=false):void{
var timeout:Boolean = true;
var time:uint = 0;
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
var timer2:Timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER,timeoutCircle);
function circle(e:TimerEvent){
if(usable){
writeObject(send,compress);
addSocketDataEvent(receive);
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
function timeoutCircle(e:TimerEvent){
if(!timeout || time >6){//完毕
timer2.stop();
timer2.removeEventListener(TimerEvent.TIMER,timeoutCircle);
}
if(timeout){
time ++;
}
if(time > 6){
Main.statusItem = new ObjectProxy({name:'服务器响应超时'});
}else{
Main.statusItem = new ObjectProxy({name:'数据获取时间:'+time});
}
}
function receive(e:ProgressEvent){
timeout = false;
var resp:Object = readObject(true);
receiverObjectHandler(resp);
removeSocketDataEvent(receive);
}
}
ok,到此今天的任务就完成了,我们利用socket的writeObject,readObject方法与服务器进行通信,用socket以amf3完成Object方式完成通信!
以下是此类的完成代码
=======================================================================
类.SocketTool
package org.sk.tools
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.events.TimerEvent;
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.utils.Timer;
import mx.utils.ObjectProxy;
/**
* Socket工具
* */
public class SocketTool
{
private var socket:Socket = new Socket();
private var bytes:ByteArray;
private var byteArrayTool:ByteArrayTool = new ByteArrayTool();
private var _usable:Boolean = false;
private var _statusInfo:String = "状态未知";
public function SocketTool(host:String,port:uint)
{
socket.connect(host,port);
socket.addEventListener(Event.CLOSE,onClose);
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
socket.addEventListener(Event.CONNECT,onConn);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
socket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
}
//默认 事件
private function onClose(e:Event){
usable = false;
statusInfo = "Socket关闭";
trace("Socket Already Closed");
}
private function onSocketData(e:ProgressEvent){
if(socket.bytesAvailable){
var r:String = socket.readMultiByte(socket.bytesAvailable,"gbk");
usable=true;
statusInfo = "Socket可用";
trace("Receive Server's Data"+r);
}
}
private function onConn(e:Event){
trace("Socket connect complete");
statusInfo = "获取安全信息,Socket不可用";
sendTestInfo();
function sendTestInfo(){
socket.writeMultiByte("<policy-file-request/>","gbk");
socket.flush();
}
}
private function onSecurityError(e:SecurityErrorEvent){
usable = false;
statusInfo = "安全错误,Socket不可用";
trace("SecurityError,check Server's [Cross Domain]");
}
private function onIoError(e:IOErrorEvent){
usable = false;
statusInfo = "io错误,Socket不可用";
trace("IoError");
}
//----
public function get statusInfo():String{
return _statusInfo;
}
public function set statusInfo(_statusInfo:String){
this._statusInfo = _statusInfo;
}
public function get usable():Boolean{
return _usable;
}
public function set usable(_usable:Boolean):void{
this._usable = _usable;
}
//关闭事件
public function addCloseEvent(closeHandler:Function):void{
removeCloseEvent(closeHandler);
socket.addEventListener(Event.CLOSE,closeHandler);
}
public function removeCloseEvent(closeHandler:Function):void{
socket.removeEventListener(Event.CLOSE,closeHandler);
}
//连接ok事件
public function addConnectEvent(connHandler:Function):void{
removeConnectEvent(connHandler);
socket.addEventListener(Event.CONNECT,connHandler);
}
public function removeConnectEvent(closeHandler:Function):void{
socket.removeEventListener(Event.CONNECT,closeHandler);
}
//安全失败事件
public function addSecurityErrorEvent(securityHandler:Function):void{
removeSecurityErrorEvent(securityHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityHandler);
}
public function removeSecurityErrorEvent(securityHandler:Function):void{
socket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,securityHandler);
}
//io error
public function addIoErrorEvent(ioHandler:Function):void{
removeIoErrorEvent(ioHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR,ioHandler);
}
public function removeIoErrorEvent(ioHandler:Function):void{
socket.removeEventListener(IOErrorEvent.IO_ERROR,ioHandler);
}
//收到 数据事件
public function addSocketDataEvent(socketDataHandler:Function):void{
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
function circle(e:TimerEvent){
if(usable){
removeSocketDataEvent(onSocketData); //移除默认事件
socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
statusInfo = "Socket已可用";
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
}
public function removeSocketDataEvent(socketDataHandler:Function):void{
socket.removeEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
}
//连接服务器
public function connect(host:String,port:uint){
socket.connect(host,port);
}
/**
* 通过回调方式完成一次发送与接收
* @send:要发送的对象
* @compress:是否要将发送对象压缩
* @receiverHandler: 接收的回调
* */
public function sendAndReceive(send:Object,receiverHandler:Function,compress:Boolean=false):void{
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
function circle(e:TimerEvent){
if(usable){
writeObject(send,compress);
addSocketDataEvent(receiverHandler);
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
}
/**
* 通过回调方式完成一次发送对象与接收对象
* @send:要发送的对象
* @compress:是否要将发送对象压缩
* @receiverObjectHandler: 接收对象的回调
* */
public function sendAndReceiverObject(send:Object,receiverObjectHandler:Function,compress:Boolean=false):void{
var timeout:Boolean = true;
var time:uint = 0;
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
var timer2:Timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER,timeoutCircle);
function circle(e:TimerEvent){
if(usable){
writeObject(send,compress);
addSocketDataEvent(receive);
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
function timeoutCircle(e:TimerEvent){
if(!timeout || time >6){//完毕
timer2.stop();
timer2.removeEventListener(TimerEvent.TIMER,timeoutCircle);
}
if(timeout){
time ++;
}
if(time > 6){
Main.statusItem = new ObjectProxy({name:'服务器响应超时'});
}else{
Main.statusItem = new ObjectProxy({name:'数据获取时间:'+time});
}
}
function receive(e:ProgressEvent){
timeout = false;
var resp:Object = readObject(true);
receiverObjectHandler(resp);
removeSocketDataEvent(receive);
}
}
/**
* 从Socket中读取压缩对象
* @uncompress:是否解压
* */
private function readObject(uncompress:Boolean=false):Object{
if(socket.bytesAvailable){
bytes = new ByteArray();
socket.readBytes(bytes,0,socket.bytesAvailable);
try{
if(uncompress){
bytes.uncompress();
}
var obj:Object = bytes.readObject();
return obj;
}catch(e){
var str:String = bytes.readMultiByte(socket.bytesAvailable,'gbk');
trace(str);
}
}
return null;
}
/**
* 向Socket中写入对象
* @compress:是否需要压缩
* */
private function writeObject(obj:Object,compress:Boolean=false):void{
var timer:Timer = new Timer(400);
timer.addEventListener(TimerEvent.TIMER,circle);
timer.start();
function circle(e:TimerEvent){
if(usable){
bytes = new ByteArray();
bytes.writeObject(obj);
if(compress)
bytes.compress();
socket.writeBytes(bytes,0,bytes.length);
socket.flush();
timer.stop();
timer.removeEventListener(TimerEvent.TIMER,circle);
}
}
}
/**
* 自动分段 传递对象
* @obj:as对象
* @compress:是否压缩
* @size:每段字节个数
* */
public function writeParticalObjectAuto(obj:Object,compress:Boolean=false,size:uint=1){
if(socket){
bytes = new ByteArray();
bytes.writeObject(obj);
if(compress)
bytes.compress();
arr = byteArrayTool.split(bytes,size);
if(arr){
socket.removeEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
socket.addEventListener(ProgressEvent.SOCKET_DATA,autoReceive);
autoSend(); //开始发送
}
}
var index:uint = 0; //当前的位置索引
var arr:Array;
//自动发送
function autoSend(){
var o:ByteArray = arr[index];
//生成 部分对象
var part:Object ={};
part.partical = o;
part.pos = index;
part.len = arr.length;
writeObject(part);
}
//自动接收
function autoReceive(e:ProgressEvent){
if(socket.bytesAvailable){
var obj:Object = readObject(true);
if(obj.next == "next"){
index ++;
autoSend();
}else if(obj.next == "done"){
socket.removeEventListener(ProgressEvent.SOCKET_DATA,autoReceive);
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
trace("对象序列全部发送完毕");
}
}
}
}
}
}
2.类 ByteArrayTool
package org.sk.tools
{
import flash.utils.ByteArray;
/*
* 字节数组工具
*/
public class ByteArrayTool
{
public function ByteArrayTool()
{
}
/**
* 将ByteArray拆分成若干段ByteArray,存入数组
* @bytes : ByteArray
* @size : 每组的最多的字节个数
* */
public function split(bytes:ByteArray,size:uint=1):Array{
var arr:Array = [];
if(bytes.length < size){
arr.push(bytes);
return arr;
}
var len:uint = bytes.length / size;
var remain:uint = bytes.length % size;
for(var i:uint = 0;i < len; i++){
var tmp:ByteArray = new ByteArray();
tmp.writeBytes(bytes,i*size,size);
arr.push(tmp);
}
if(remain > 0){
var tmp:ByteArray = new ByteArray();
tmp.writeBytes(bytes,len * size ,remain);
arr.push(tmp);
}
return arr;
}
/**
* @size : size 组
* */
public function split2(bytes:ByteArray,groupSize:uint):Array{
var arr:Array = [];
var count:uint = bytes.length / groupSize; //每组的字节数
var remain:uint = bytes.length % groupSize;
for(var i:uint = 0;i<groupSize;i++){
var tmp:ByteArray = new ByteArray();
tmp.writeBytes(bytes,i*groupSize,count);
if(i == (groupSize-1)){
if(remain > 0){
tmp.writeBytes(bytes,groupSize * count,remain);
}
}
arr.push(tmp);
}
return arr;
}
}
}
封装自己的Flex工具_SocketTool相关推荐
- 原生JS基于window.scrollTo()封装垂直滚动动画工具函数
概要: 原生JS基于window.scrollTo()封装垂直滚动动画工具函数,可应用与锚点定位.回到顶部等操作. ####封装原因: 在vue项目中,遇到需要实现垂直滚动效果的需求,初步想到的方法有 ...
- uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具
阐述如何将一个常用的 bash 脚本融入 npm 生态之中,此处以最近遇到的一个 CR 提交脚本为例. 背景 作为程序猿,大家或多或少地都用过 GitHub 上的 merge request 功能.当 ...
- 封装一个邮件发送工具类,一个字,巴适
系列文章目录 文章目录 系列文章目录 前言 一. 介绍 二.二话不说开始干 1.引入库 2. 邮件发送实体(Mail) 3. 邮件发送类型枚举(MailType ) 4.邮件发送抽象类(Abstrac ...
- 【更新】【封装必备】封装辅助 - 清理优化工具 For Win7(IT天空会员专版)
https://www.itsk.com/thread-353560-1-4.html nqawen 发表于 2015-7-9 17:26:37 本帖最后由 Amz 于 2015-11-25 10 ...
- ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。
DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...
- 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive
第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...
- Flutter - 一个fultter练习项目(仿写微信UI、实现一些常用效果、封装通用组件和工具类)
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 pwd:123456 代码不定期更新 注:Flut ...
- 少年郎,你需要封装好的ViewPager工具类
作者:夏至,欢迎转载,也请保留这段申明,谢谢 blog.csdn.net/u011418943/- 你是否有遇到这样的问题,每次开发一个新的项目,在 viewpager 这一块上,总是在做重复的东西, ...
- Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://blog.csdn.net/weixin_44953227/articl ...
- kicad 自动生成封装库_【工具】KiCad版本嘉立创SMT贴片库及问题说明
原理图库由工具直接生成,封装库先在AD中转换成PCAD ASCII格式,再通过工具转成KiCad格式 KiCad立创贴片库特点: 1. 原理图库支持AD集成库中所有元件,并且包含元件中所有文字字段,原 ...
最新文章
- 柔性生态布局未来,小鱼易连 2019“深耕视界逐梦小鱼”北京火爆招募
- 20165313 《Java程序设计》第七周学习总结
- VS2010主题设置及插件推荐
- 安迈云加入GDCA全球分布式云联盟,携手业内共建新生态
- Hihocoder 1142 三分
- 1. JanusGraph的优势
- java异常网,Java异常实践事项
- 自动化测试——接口测试——增删改查
- pycharm 显示空格及tab
- Javascript实践-Function对象扩展之延时执行函数
- python-白盒测试方法
- 推荐凸优化经典书籍,来自boyd
- 大数据时代的“被遗忘权”之争
- uiautomation(如何)实现自动化
- 极值滤波matlab,极值滤波算法MATLAB程序及处理结果对比
- 未来影响爬架行业的4大技术趋势
- 2021-05-10 关于vant按钮小程序点击后出现灰色背景去除方式
- 英伟达CUVID硬解,并通过FFmpeg读取文件
- 基于java的坦克大战游戏
- 发明专利申请疑问解答分享