Flash AS3教程:ApplySocket类(2)

http://www.itjxue.com  2015-07-17 23:39  来源:未知  点击次数: 

ApplySocket类源代码:

CODE:

package index.base.net{
       
        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;
                }
        }
}
ApplySocketEvent 事件类源代码

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);
                }
        }
}

(责任编辑:IT教学网)

更多

推荐Flash actionscript文章