Flash AS3教程:ApplySocket类(2)
ApplySocket类源代码:
CODE:
package index.base.net{
ApplySocketEvent 事件类源代码
import flash.events.EventDispatcher;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.net.Socket;
import index.base.events.ApplySocketEvent;
public class ApplySocket extends EventDispatcher{
private var socket:Socket;
public static const ARRAY:String = "Array";
public static const STRING:String = "String";
public static const OBJECT:String = "Object";
public static const ARRAY_ARRAY:String = "ArrayArray";
public static const ARRAY_OBJECT:String = "ArrayObject";
public var host:String;
public var port:int;
public var space:String = " ";
public var ls:String = "{";
public var rs:String = "}";
public var isSide:Boolean;
public var datatype:String;
public var connected:Boolean = false;
public function ApplySocket(_isSide:Boolean = false,_datatype:String = "String"){
isSide = _isSide;
datatype = _datatype;
}
//连接
public function connect(_host:String,_port:int):void{
host = _host;
port = _port;
if(connected) socket.close();
socket = new Socket;
socket.connect(host,port);
socket.addEventListener(IOErrorEvent.IO_ERROR,errorFun);
socket.addEventListener(Event.CONNECT,connectFun);
}
//发送
public function send(...strs):void{
if(datatype == OBJECT || datatype == ARRAY_OBJECT){
if(strs.length < 2) throw new Error("当数据类型等于Object或者ArrayObject的时候,send方法传入参数必须两个或者两个以上!");
}
var str:String = "";
for(var i:int = 0; i < strs.length; i ++){
str += strs[i];
if(i != strs.length - 1) str += space;
}
if(isSide) str = ls + str + rs;
socket.writeUTFBytes(str);
socket.flush();
}
//断开
public function close():void{
clearEvent();
connected = false;
socket.close();
socket = null;
}
//连接事件
private function connectFun(e:Event):void{
connected = true;
clearEvent();
socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataFun);
socket.addEventListener(Event.CLOSE,closeFun);
dispatchEvent(new ApplySocketEvent(ApplySocketEvent.CONNECT));
}
//关闭事件
private function closeFun(e:Event):void{
connected = false;
dispatchEvent(new ApplySocketEvent(ApplySocketEvent.CLOSE));
}
//失败事件
private function errorFun(e:IOErrorEvent):void{
close();
dispatchEvent(new ApplySocketEvent(ApplySocketEvent.ERROR));
}
//接收事件
private function socketDataFun(e:ProgressEvent):void{
var i:int;
var tmp:Object = socket.readUTFBytes(socket.bytesAvailable);
if(isSide){
tmp = tmp.match(new RegExp("\\" + ls + "[^\\" + rs + "]*\\" + rs,"g"));
for(i = 0; i < tmp.length; i ++){
var str:String = tmp[i];
tmp[i] = str.substr(1,str.length - 2);
}
}
switch(datatype){
case STRING:
if(tmp is Array) tmp = tmp.join("");
break;
case ARRAY:
if(tmp is String) throw new Error("错误!如果数据类型选择Array,那么isSide必须为true!");
break;
case OBJECT:
if(tmp is Array) throw new Error("错误!如果数据类型选择Object,那么isSide必须为false!");
tmp = change(tmp as String);
break;
case ARRAY_OBJECT:
if(tmp is String) throw new Error("错误!如果数据类型选择ArrayObject,那么isSide必须为true!");
for(i = 0; i < tmp.length; i ++) tmp[i] = change(tmp[i]);
break;
case ARRAY_ARRAY:
if(tmp is String) throw new Error("错误!如果数据类型选择ArrayArray,那么isSide必须为true!");
for(i = 0; i < tmp.length; i ++) tmp[i] = tmp[i].split(space);
break;
}
var eve:ApplySocketEvent = new ApplySocketEvent(ApplySocketEvent.SYNC);
eve.data = tmp;
dispatchEvent(eve);
tmp = null;
eve = null;
}
//清理事件侦听
private function clearEvent():void{
if(socket != null){
if(socket.hasEventListener(IOErrorEvent.IO_ERROR)) socket.removeEventListener(IOErrorEvent.IO_ERROR,errorFun);
if(socket.hasEventListener(Event.CONNECT)) socket.removeEventListener(Event.CONNECT,connectFun);
if(socket.hasEventListener(ProgressEvent.SOCKET_DATA)) socket.removeEventListener(ProgressEvent.SOCKET_DATA,socketDataFun);
if(socket.hasEventListener(Event.CLOSE)) socket.removeEventListener(Event.CLOSE,closeFun);
}
}
//转换Object
private function change(tmp:String):Object{
var tmpAr:Array = tmp.split(space);
var obj:Object = new Object;
obj[tmpAr.shift()] = tmpAr.join(space);
tmpAr = null;
return obj;
}
}
}
CODE:
package index.base.events{
import flash.events.Event;
public class ApplySocketEvent extends Event{
public static const CONNECT:String = "connect";
public static const CLOSE:String = "close";
public static const SYNC:String = "sync";
public static const ERROR:String = "error";
public var data:Object;
public function ApplySocketEvent(type:String){
super(type);
}
}
}