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