当前位置 : 主页 > 手机开发 > 其它 >

Cocos2d-x-javaScript 的webSocket的代码

来源:互联网 收集:自由互联 发布时间:2021-06-13
var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket; var WebSocketManager = cc.Class.extend({ ? ? _wsObj: null , ? ? _wsReConnectTimes: 0 , ? ? _reConnectMax: 3 , ? ? _connectTimeout: 5 , ? ? _reConnectFlag: false , ? ? _ms



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;

};

网友评论