• Cocos2d-x-javaScript 的webSocket的代码




    var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket;

    var WebSocketManager = cc.Class.extend({


        _wsObj:null,

        _wsReConnectTimes:0,

        _reConnectMax:3,

        _connectTimeout:5,

        _reConnectFlag:false,


        _msg:null,

        _msgKey:null,

        _msgSendStatus:'nothing',

        _msgTimeout:5,

        _msgTimeoutTimes:0,


        _msgGet:'',


        _target:null,

        _callback:null,


        ctor:function () {

            NC.addObserver(this,this.connectTimeoutHandle, 'ws_connect_timeout');

            NC.addObserver(this,this.sendTimeoutHandle, 'ws_timeout');

        },


        //打开连接

        openConnect:function () {


           if(this._wsObj){

               this._wsObj.close();

               return;

            }


           this._wsObj = null;

           var self = this;


           this._wsObj = new WebSocket(CFG_SER.ws_ser);


            cc.log("WS CONNECTING." + CFG_SER.ws_ser);


           //连接超时推断

            director.getScheduler().scheduleCallbackForTarget(this,this.connectTimeoutCheck,0, 0, this._connectTimeout);


           this._wsObj.onopen = function (evt) {

                self.openGet(evt);

            };


           this._wsObj.onmessage = function (evt) {

                self.messageGet(evt);

            };


           this._wsObj.onerror = function (evt) {

                self.errorGet(evt);

            };


           this._wsObj.onclose = function (evt) {

                self.closeGet(evt);

            };

        },


        //连接超时推断

        connectTimeoutCheck:function(){


           if(CFG_SER.is_websock && this._wsObj && this._wsObj.readyState == WebSocket.CONNECTING){

               //重连次数

               if(this._wsReConnectTimes >this._reConnectMax){

                    //重试过多后。应该提示玩家眼下网络不稳定

                    GY_ti_shi_popup.getInstance().show(L('gy:ws_wang_luo_bu_wen'));

                }else{

                   this._wsReConnectTimes++;

                    GY_ti_shi_popup.getInstance().show(L('gy:ws_timeout'),'ws_connect_timeout');

                }

            }else{

               this.connectTimeoutHandle();

            }


        },


        //超时后又一次连接

        connectTimeoutHandle:function(){

           //又一次打开连接

           this.closeConnect();

        },


        //关闭连接

        closeConnect:function () {

            cc.log("WS CLOSING.");

           if(this._wsObj){

               this._wsObj.close();

            }

        },


        //连接后处理

        openGet:function (evt) {

            cc.log("WS was opened.");


            //获得连接的消息后,去掉超时推断

            director.getScheduler().unscheduleCallbackForTarget(this,this.connectTimeoutCheck);


           //清除重连次数

           this._wsReConnectTimes = 0;


            //是否有未发送的消息又一次发送

           if (this._msgSendStatus =='msgReady' && this._msg) {

               this.sendRequest();

            }

        },


        //获得消息

        messageGet:function (evt) {

           this._msgGet = evt.data;

           try{

               if (this._msgGet.length <10000)

                    cc.log('response:' +this._msgGet);

               else

                    cc.log('content too long to display.');

            }catch(e){

                cc.log('too large');

            }


           try{

               var resObj = JSON.parse(this._msgGet);

            }catch (e){

                GY_msg_popup.getInstance().show(L('gy:request_err'));

            }


           if (resObj._st == 1) {

                GY_tools.fan_yi_http_body(resObj._body);


               //推断是什么消息

               if(this._msgSendStatus =='msgSend' && resObj._body.func == this._msgKey){

                   this.requestResponse(resObj);

                }else{

                   switch (resObj._body.func){

                       case 'chong_zhi'://这里做一些自己的处理逻辑

                           break;

                    }

                }

            }else{

                cc.log('request data err');

                GY_msg_popup.getInstance().show(L('gy:request_data_err'));

            }

        },


        //获取错误

        errorGet:function (evt) {

            cc.log("WS Error");

           this.closeConnect();

        },


        //连接关闭处理

        closeGet:function (evt) {

            cc.log("websocket instance closed.");

           this._wsObj = null;

            //连接关闭立即进行重试

           this.openConnect();

        },


       /**

         * 给服务器发送消息

         * @param act

         * @param params

         * @param callback

         * @param target

         */

        sendGetRequest:function (act, params, callback, target) {


           this.beforeRequestSend(act, params, callback, target);

           //推断当前连接

           if (this.isOpen()) {

               this.sendRequest();

            }

           else {

               this.openConnect();

            }

        },


        //准备消息

        beforeRequestSend:function (act, params, callback, target) {

            //弹出loading

            GY_loading_popup.getInstance().show();


           //消息拼接

           this._msg = {'pathname':'', 'query':''};

           this._msg.pathname = '/' + act;

            G.js_jiao_se ? params.id_jiao_se = G.js_jiao_se.id_jiao_se :null;


            //由于之前是HTTP的请求,须要将參数变成字符串的

           var p = {};

           for (key in params) {

                p[key] ='' + params[key];

            }


           this._msg.query = p;


            //注冊消息,回调

           this._msgKey = this._msg.pathname;

           this._target = target;

           this._callback = callback;


           this._msgSendStatus = 'msgReady';

        },


        //发送消息

        sendRequest:function () {

            cc.log('send request :');

            cc.log(JSON.stringify(this._msg));

           this._wsObj.send(JSON.stringify(this._msg));

           this._msgSendStatus = 'msgSend';


           //设置超时时间

            director.getScheduler().scheduleCallbackForTarget(this,this.sendTimeoutCheck,0, 0, this._msgTimeout);

        },


        //消息被响应了

        requestResponse:function (resObj) {


            //获得响应的消息后,去掉loading遮罩

            director.getScheduler().unscheduleCallbackForTarget(this,this.sendTimeoutCheck);

           this._msg = null;

           this._msgSendStatus = 'nothing';

            GY_loading_popup.getInstance().hide();


           this._callback.call(this._target, resObj._body);

        },


        //发送消息超时推断

        sendTimeoutCheck:function(){

           if(this._msgSendStatus =='msgSend'){

                //消息没有被响应。去掉loading遮罩

                GY_loading_popup.getInstance().hide();

                GY_ti_shi_popup.getInstance().show(L('gy:ws_timeout'),'ws_timeout');

            }

        },


        //超时后又一次获取玩家信息 并刷新当前页面

        sendTimeoutHandle:function(){

            var act ='gc/jiao_se/deng_lu';

           var param = {};

            param.gc_token = LS.getItem('gc_token');

            param.id_yong_hu = LS.getItem('id_yong_hu');

            param.zhouqi = LS.getItem('uc_zhouqi');

            HttpManager.create().sendGetRequest(act, param,this.callbackTimeoutHandle, this);

        },


        //超时消息处理

        callbackTimeoutHandle:function(resObj){

           if (resObj.st_code == 1) {

               if (G.js_jiao_se.zt_jiao_se == 1) {

                    SM.goto_page('DL_chuang_ming_page');

                }else if (G.js_jiao_se.zt_jiao_se ==2) {

                    SM.goto_page('YD_yin_dao_' + G.js_jiao_se.xin_shou_jin_du +'_page');

                }else if (G.js_jiao_se.zt_jiao_se ==3) {

                    //SM.goto_page('SY_shou_ye_page');

                   //试试看直接刷新页面的效果吧

                    SM.flush_page();

                }

            }

        },


        //推断ws是否已经连接

        isOpen:function(){

         return (this._wsObj &&this._wsObj.readyState == WebSocket.OPEN);

        },


        purge:function () {

            NC.removeObserver(this,'ws_timeout');

            NC.removeObserver(this,'ws_connect_timeout');

           this.closeConnect();

           this._instance = null;

        }

    });


    WebSocketManager._instance =null;

    WebSocketManager.getInstance =function () {

       if (!this._instance) {

           this._instance = new WebSocketManager();

        }

       return this._instance;

    };

  • 相关阅读:
    HTML DOM clearInterval() 方法
    clone() 方法
    Java EE 6体系结构的变革
    我们看人的眼光
    NetBeans 时事通讯(刊号 # 44 Feb 10, 2009)
    jBPM 与项目的适用性探讨
    Java EE 6体系结构的变革
    jBPM 与项目的适用性探讨
    系分又挂了 :)
    NetBeans 时事通讯(刊号 # 44 Feb 10, 2009)
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10960716.html
  • Copyright © 2020-2023  润新知