websocket连接示例备份

import { Egg_IfObserver as IfObserver } from "./Egg_IfObserver";

import { Egg_MsgCode as MsgCode} from "../Comm/Egg_MsgCode";

import { msg_def } from "../Protobuf/proto";

import { Egg_ResLogin } from "./Egg_ResLogin";

import { Egg_Tools } from "./Egg_Tools";

import Egg_OfflineArea from "../Others/Egg_OfflineArea";

export class Egg_NetManager

{

    m_webSocket : WebSocket;

    m_arObservers : Array<IfObserver>;

    public static m_bManual : boolean;

    public static m_inst;

    private static m_resolve : any;

    public static get _inst() : Egg_NetManager

    {

        if(!this.m_inst)

        {

            this.m_inst = new Egg_NetManager();

        }

        return this.m_inst;

    }

    //开启新的连接之前,调用初始连接信息,此调用会关闭先前的连接

    public static Init(ip : string,port : number,bLogin : boolean)

    {     

        let login = bLogin ? "true" : "false";

        cc.sys.localStorage.setItem("ip",ip);

        cc.sys.localStorage.setItem("port",port);       

        cc.sys.localStorage.setItem("login",login);

    }

    constructor()

    {

        let ip : string = cc.sys.localStorage.getItem("ip");

        let port : number = cc.sys.localStorage.getItem("port");     

        if(ip == null || port == null)

        {

            console.error("mylog : ip or port is null");

            return;

        }

        this.InitData();     

        this.InitSocket("ws://" + ip + ":" + port);

    }

    public IsConnected()

    {

        Egg_NetManager.m_resolve = null;

        return new Promise((resolve,reject)=>{

            Egg_NetManager.m_resolve = resolve;

        });

    }

    private InitData()

    {

        this.m_arObservers = new Array<IfObserver>();

    }

    private InitSocket(serverIP : string)

    {     

        let strBLogin = cc.sys.localStorage.getItem("login");

        this.m_webSocket = new WebSocket(serverIP);

        this.m_webSocket.binaryType = "arraybuffer";

        this.m_webSocket.onopen = this.OnOpen.bind(this);

        //登录和普通消息 消息头不一致,分开处理

        if(strBLogin == "true")

        {         

            this.m_webSocket.onmessage = this.OnMessageForLogin.bind(this);

        }else

        {           

            this.m_webSocket.onmessage = this.OnMessage.bind(this);

        }       

        this.m_webSocket.onclose = this.OnClose.bind(this);

        this.m_webSocket.onerror = this.OnError.bind(this);

    }


    private OnOpen()

    {

        Egg_NetManager.m_bManual = false;

        console.log("[连接服务器成功]");

        if(Egg_NetManager.m_resolve)

        Egg_NetManager.m_resolve(true);

    }

    private OnMessage(event)

    {

        console.log("[服务器响应了]");

        let data = new Uint8Array(event.data);

        if(!data)

        {

            throw new console.error("event.data is null");

        }

        let msgHeader : msg_def.msg_header = msg_def.msg_header.decode(data);

        console.log("接收到消息 = " + msgHeader.msgId);

        this.NotifyAllObserver(msgHeader.msgId,msgHeader.payload);       

    }

    //登录专用消息响应转发

    private OnMessageForLogin(event)

    {

        console.log("[登录服务器响应了]");

        let data = new Uint8Array(event.data);   

        if(!data)

        {

            throw new console.error("event.data is null");

        }

        let msgHeader : msg_def.login_msg_header = msg_def.login_msg_header.decode(data);

        this.NotifyAllObserver(msgHeader.msgId,msgHeader.payload);

        console.log("登录:接收到消息 = " + msgHeader.msgId);

    }

    private OnClose()

    {     

        console.warn("[连接关闭]");

        this.m_webSocket = null;

        //连接断开了,点击任意区域重新加载

        let offlineArea = cc.find("Canvas/OfflineArea");

        if(offlineArea && !Egg_NetManager.m_bManual)

        {

            offlineArea.active = true;

            let ctrl : Egg_OfflineArea = offlineArea.getComponent("Egg_OfflineArea");

            ctrl.StartCountdown(10);

        }

    }

    private OnError(event)

    {

        console.error("[连接异常]:" + event);

        this.m_webSocket = null;

        if(Egg_NetManager.m_resolve)

        Egg_NetManager.m_resolve(false);

    }

    //添加网络消息观察者

    public AttachObserver(observer : IfObserver)

    {     

        this.m_arObservers.push(observer);

    }

    //移除观察者

    public DetachObserver(observer : IfObserver)

    {

        for(let i = 0;i < this.m_arObservers.length;i++)

        {

            if(observer == this.m_arObservers[i])

            {

                this.m_arObservers.splice(i,1);

            }

        }

    }


    //通知观察者有事件到达

    //注意:场景切换时,会出现多次附加观察者的情况,记得detach释放

    public NotifyAllObserver(msgCode : MsgCode,data : Object)

    {

        this.m_arObservers.forEach(item => {

            if(item)

            {

                item.OnReceive(msgCode,data);

            }         

        });

    }


    //根据消息码发送(登录头不一致,故不可用于登录,登录用SendRaw)

    public Send(msgCode : MsgCode,st : any,data : any)

    {

        let objPayload = null;

        if(data != null)

        {

            objPayload = st.encode(data).finish();           

        }     

        let len = 0;

        if(data != null) len = objPayload.length;

        let msgHeader = msg_def.msg_header.create({

            msgId : msgCode,

            playerId : Egg_ResLogin.player_id,

            token : Egg_ResLogin.token,

            payloadLen : len,

            payload : objPayload,

        });

        let objHeader = msg_def.msg_header.encode(msgHeader).finish();

        this.m_webSocket.send(objHeader);

        console.log("mylog 发送消息 " + msgCode);

    }

    //原始发送

    public SendRaw(obj : any)

    {

      // console.log("登录服务器发送原始数据" + obj);   

        this.m_webSocket.send(obj);

    }

    //发送http请求

    public Get(url : string,cb : CallableFunction,bAsync : boolean = true)

    {

        let xhr = cc.loader.getXMLHttpRequest();

        xhr.open("GET",url,bAsync);

        xhr.setRequestHeader("Content-Type","application/json;charset=UTF-8"); 

        xhr.onreadystatechange = function () { 

            if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status <= 207)) { 

                cb(true,xhr.responseText);

            }else

            {

                cb(false,"");

            }

        }; 

        xhr.send();

    }

    //发送http请求

    public Post(url : string,data : string,cb : CallableFunction,bAsync : boolean = true)

    {

        if(data == null) data = "";

        let xhr = cc.loader.getXMLHttpRequest();

        xhr.open("POST",url,bAsync);

        xhr.setRequestHeader("Content-Type","multipart/form-data"); 

        xhr.onreadystatechange = function () { 

            if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status <= 207)) { 

                cb(true,xhr.responseText);

            }else

            {

                cb(false,"");

            }

        }; 

        xhr.send(data);

    }

    //释放此网络管理器

    public Destroy()

    {

        let webSocket = Egg_NetManager._inst.m_webSocket;

        if(webSocket)

        {

            Egg_NetManager.m_bManual = true;

            webSocket.close();           

        }

        this.m_webSocket = null;

        Egg_NetManager.m_inst = null;

        cc.sys.localStorage.setItem("ip",null);

        cc.sys.localStorage.setItem("port",null);

        cc.sys.localStorage.setItem("login",null);

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 面试题 js面试题 __proto__和prototype之间的关系是什么? 所以的对象都有__proto__属性...
    JackOran阅读 204评论 0 1
  • 日常学习知识点总结(JS篇) 1、闭包: 闭包就是函数中的函数,里面的函数可以访问外面函数的变量,外面的变量是内部...
    依稀_Sting阅读 2,056评论 0 1
  • js新特性之网络编程 1.h5新增存储方案 <!DOCTYPE html> 18-H5新增存...
    煤球快到碗里来阅读 379评论 0 0
  • 基本信息 es6中const定义的属性是否可以改变? 可以的,为什么会这样呢?这是由于对象或者数组属于引用数据类。...
    习惯就好a阅读 8,558评论 0 1
  • JSV5 1、vue 双向绑定的原理 通过object.defineProperty()方法来劫持属性的gette...
    merlinxu阅读 1,141评论 0 1