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

var WebSocketManager = cc.Class.extend({

    _wsObj:null,

    _wsReConnectTimes:,

    _reConnectMax:,

    _connectTimeout:,

    _reConnectFlag:false,

    _msg:null,

    _msgKey:null,

    _msgSendStatus:'nothing',

    _msgTimeout:,

    _msgTimeoutTimes:,

    _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._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 =
;

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

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

           this.sendRequest();

        }

    },

    //获得消息

    messageGet:function (evt) {

       this._msgGet = evt.data;

       try{

           )

                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 ==
) {

            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._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 ==
) {

           if (G.js_jiao_se.zt_jiao_se ==
) {

                SM.goto_page('DL_chuang_ming_page');

            }else
) {

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

            }else
) {

                //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;

};

Cocos2d-x-javaScript 的webSocket的代码的更多相关文章

  1. Java 与 JavaScript 对websocket的使用

    ebsocket,HTML5中新一代全双工通信协议.其底层仍然是http协议. 传统 HTTP 请求响应客户端服务器交互图 WebSocket 请求响应客户端服务器交互图 WebSocket 客户端支 ...

  2. 如何实现 javascript “同步”调用 app 代码

    在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...

  3. 在线运行Javascript,Jquery,HTML,CSS代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xht ...

  4. 《Secrets of the JavaScript Ninja》:JavaScript 之运行时代码

    最近,在阅读 jQuery 之父 John Resig 力作:Secrets of the JavaScript Ninja(JavaScript忍者秘籍).关于第九章提及的 JavaScript 之 ...

  5. javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数

    javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...

  6. JavaScript创建读取cookie代码示例【附:跨域cookie解决办法】

    使用JavaScript 原生存取cookie代码示例: var cookie = { set : function(name, value, expires, path, domain, secur ...

  7. JavaScript之WebSocket技术详解

    概述 HTTP协议是一种无状态协议,服务器端本身不具有识别客户端的能力,必须借助外部机制,比如session和cookie,才能与特定客户端保持对话.这多多少少带来一些不便,尤其在服务器端与客户端需要 ...

  8. JavaScript调用App原生代码(iOS、Android)通用解决方案

    实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功以后将用户的手机号返回给H5页面,显示出来.这个场景应该算是比较完整的一次H5中的 ...

  9. Javascript时间差计算函数代码实例

    Javascript时间差计算函数代码实例 <script language="javascript"> Date.prototype.dateDiff = funct ...

  10. javascript 元编程之-代码修改代码

    javascript 元编程之-代码修改代码 引言 重构代码是个体力活,特别是在确定重构方案后,剩下就是按方案调整代码,然后进行测试. 如何有好又快的调整到位代码,这是件不容易的事. 简单的代码,可以 ...

随机推荐

  1. 为什么要重写hashcode( )和equals( )?

    打个比方,一个名叫张三的人去住酒店,在前台登记完名字就去了99层100号房间,此时警察来前台找叫张三的这个人住在哪间房,经过查询,该酒店住宿的有50个叫张三的,需要遍历查询,查询起来很不方便. 那么就 ...

  2. C# 更改 Hashtable key 名称

    Hashtable ht = new Hashtable(); ht[; ht["B"] = ht["标题"]; ht.Remove("标题" ...

  3. #333 Div2 Problem B Approximating a Constant Range (尺取 && RMQ || 尺取 && multiset)

    题目链接:http://codeforces.com/contest/602/problem/B 题意 :给出一个含有 n 个数的区间,要求找出一个最大的连续子区间使得这个子区间的最大值和最小值的差值 ...

  4. 为什么C++中只有指针和引用才能实现多态?

    代码: class A { public: virtual void Debug(){} }; class B:public A { public: virtual void Debug(){} }; ...

  5. 编译依赖ndt_gpu库的包,遇到Eigen报错

    背景: 使用NDT建图,帧率比较慢,打算使用gpu加速计算. ndt_gpu是一个使用gpu加速ndt计算的库,首先在工作空间编译这个包. 然后在ndtMap包中链接这个库,其CMakelists.t ...

  6. Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

    有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...

  7. 【ELK学习】初识ElasticSearch

    ES(elasticsearch) 是一个高可扩展的.开源的全文检索和分析引擎,它允许你存储.检索.分析海量数据,以一种快到近乎实时的速度. ES用例场景: 使用ES存储商品目录.清单,提供检索.输入 ...

  8. 第三周课程总结&实验报告(一)

    实验报告(一) 1.打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数" ...

  9. 第五周总结&实验报告三

    第五周总结&实验报告三 实验报告 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) ① 统计该字符串中字母s ...

  10. C语言字符数组详解

    字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对这些字符进行存储,即通过字符数组存储.字符数 ...