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,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); ? ? ? ? }; ? ? },0);"> ? ? //连接超时推断 ? ? 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(); ? ? ? ? } ? ? },0);"> ? ? //超时后又一次连接 ? ? connectTimeoutHandle:function(){ ? ? ? ?//又一次打开连接 ? ? ? ?this.closeConnect(); ? ? },0);"> ? ? //关闭连接 ? ? closeConnect:function () { ? ? ? ? cc.log("WS CLOSING."); ? ? ? ?if(this._wsObj){ ? ? ? ? ? ?this._wsObj.close(); ? ? ? ? } ? ? },0);"> ? ? //连接后处理 ? ? 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(); ? ? ? ? } ? ? },0);"> ? ? //获得消息 ? ? 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‘)); ? ? ? ? } ? ? },0);"> ? ? //获取错误 ? ? errorGet:function (evt) { ? ? ? ? cc.log("WS Error"); ? ? ? ?this.closeConnect(); ? ? },0);"> ? ? //连接关闭处理 ? ? 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,target); ? ? ? ?//推断当前连接 ? ? ? ?if (this.isOpen()) { ? ? ? ? ? ?this.sendRequest(); ? ? ? ? } ? ? ? ?else { ? ? ? ? ? ?this.openConnect(); ? ? ? ? } ? ? },0);"> ? ? //准备消息 ? ? beforeRequestSend:function (act,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‘; ? ? },0);"> ? ? //发送消息 ? ? 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,this._msgTimeout); ? ? },0);"> ? ? //消息被响应了 ? ? 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‘); ? ? ? ? } ? ? },0);">? ? //超时后又一次获取玩家信息 并刷新当前页面 ? ? 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); ? ? },0);"> ? ? //超时消息处理 ? ? 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(); ? ? ? ? ? ? } ? ? ? ? } ? ? },0);"> ? ? //推断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; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |