as3 sokcet通信

as3 sokcet通信


package game.Core{

import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.*;
import flash.net.Socket;
import flash.system.Security;
import flash.utils.ByteArray;
import flash.utils.setTimeout;

import org.robotlegs.mvcs.Actor;

/**通信连接对象 单例**/
public class Socketer extends Actor{
    private var socket:Socket=new Socket();
    private var _host:String="127.0.0.1";
    private var _port:int=9999;

    public var dataParser:DataProcess;

    private var needReadHead:Boolean=true;//判断一个包是否读取完整,为ture完整,false不完整
    public var sendData:ByteArray = new ByteArray();
    public var revData:ByteArray = new ByteArray();

    private static var loader:URLLoader = new URLLoader();

    //断线重连间隔时间
    private var _reconnectTime :int = 1;



    public function Socketer(){

        IntinSocket();
    }

    private function IntinSocket():* {
        sendData.length = 255;
        revData.length = 255;

        //加载策略文件
        var urlLoader:URLLoader = new URLLoader();
        urlLoader.addEventListener(Event.COMPLETE, HandleCompleted);
        urlLoader.load(new URLRequest("Security.xml"));
	
        socket.addEventListener(Event.CONNECT, OnConnect);

        socket.addEventListener(Event.CLOSE, OnClose);
        socket.addEventListener(ProgressEvent.SOCKET_DATA, OnSocketData);
        socket.addEventListener(IOErrorEvent.IO_ERROR, OnIoError);
        socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityError);

    }

    public function Connect(){
        trace("socket开始申请连接... ...");
        socket.connect("127.0.0.1",9999);

    }

    private function HandleCompleted(event: Event): void{
        var configXML: XML = XML(loader.data);
        Security.loadPolicyFile(configXML.toXMLString());
    }

    private function OnConnect(e:Event):void{
        trace("连接成功... ...");
        trace(socket);
        dataParser||=new DataProcess();
        _reconnectTime = 1;
        dispatch(new Event(Event.CONNECT));
    }
    private function OnClose(e:Event):void{
        trace("客户端关闭... ... ");
        socket.removeEventListener(Event.CONNECT,OnConnect);
        socket.removeEventListener(Event.CLOSE,OnClose);
        socket.removeEventListener(ProgressEvent.SOCKET_DATA,OnSocketData);
        socket.removeEventListener(IOErrorEvent.IO_ERROR,OnIoError);
        socket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,OnSecurityError);
    }
    private function OnIoError(e:IOErrorEvent):void{
        trace("连接IP/端口号错误或服务器未开启\nIP:" + _host + " port:" + _port);
        setTimeout(Connect, _reconnectTime*=10);//断线重连
    }
    private function OnSecurityError(e:SecurityErrorEvent):void{
        trace("OnSecurityError");
        setTimeout(Connect, _reconnectTime*=10);//断线重连
    }

    private function OnSocketData(e:ProgressEvent):void{
        while(socket.bytesAvailable) {
            var dataLength:uint = 0;
            if (needReadHead) {
                dataLength = socket.readShort();//读包长
                needReadHead = false;
            }
            if (!needReadHead) {
                if (socket.bytesAvailable >= dataLength) {
                    revData.position = 0;

                    socket.readBytes(revData, 0, dataLength);

                    revData.position = 0;
                    dataParser.AnalyzeData(revData);//数据包分解
                    needReadHead = true;
                } else {
                    break;
                }
            }
        }
    }

    /**
     *  向socket写入数据
     */
    public function send():void{
            socket.writeShort(sendData.position);
			socket.writeBytes(sendData,0,sendData.position);
			socket.flush();
            sendData.clear();
		}
    }

}

你可能感兴趣的:(as3 sokcet通信)