Cocos2d-x-javaScript 的webSocket的代码
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的代码的更多相关文章
- Java 与 JavaScript 对websocket的使用
ebsocket,HTML5中新一代全双工通信协议.其底层仍然是http协议. 传统 HTTP 请求响应客户端服务器交互图 WebSocket 请求响应客户端服务器交互图 WebSocket 客户端支 ...
- 如何实现 javascript “同步”调用 app 代码
在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...
- 在线运行Javascript,Jquery,HTML,CSS代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xht ...
- 《Secrets of the JavaScript Ninja》:JavaScript 之运行时代码
最近,在阅读 jQuery 之父 John Resig 力作:Secrets of the JavaScript Ninja(JavaScript忍者秘籍).关于第九章提及的 JavaScript 之 ...
- javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数
javascript 写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数 function test(){ var bt = document.getElementById(" ...
- JavaScript创建读取cookie代码示例【附:跨域cookie解决办法】
使用JavaScript 原生存取cookie代码示例: var cookie = { set : function(name, value, expires, path, domain, secur ...
- JavaScript之WebSocket技术详解
概述 HTTP协议是一种无状态协议,服务器端本身不具有识别客户端的能力,必须借助外部机制,比如session和cookie,才能与特定客户端保持对话.这多多少少带来一些不便,尤其在服务器端与客户端需要 ...
- JavaScript调用App原生代码(iOS、Android)通用解决方案
实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功以后将用户的手机号返回给H5页面,显示出来.这个场景应该算是比较完整的一次H5中的 ...
- Javascript时间差计算函数代码实例
Javascript时间差计算函数代码实例 <script language="javascript"> Date.prototype.dateDiff = funct ...
- javascript 元编程之-代码修改代码
javascript 元编程之-代码修改代码 引言 重构代码是个体力活,特别是在确定重构方案后,剩下就是按方案调整代码,然后进行测试. 如何有好又快的调整到位代码,这是件不容易的事. 简单的代码,可以 ...
随机推荐
- EF大数据插入
_April给出代码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotati ...
- JUnit——单元测试
写了个类,要给别人用,会不会有bug?怎么办?测试一下. JUnit可以测试JDBC.Servelet.Struts.Spring.Hibernate等等. 单元测试是开发人员的工作,测试人员负责测试 ...
- Cisco基础(三):HSRP配置、三层交换配置HSRP、STP的配置、三层交换配置STP
一.HSRP配置 目标: 在企业网络到外部的连接方案中,要求不高的条件下可以是单出口.一旦该出口线路出现问题,整个企业网络就不能连接到外网了.为了使得企业网络到外网连接的高可用性,可以设置两个以上的出 ...
- Vue(核心思想)
1.Es6语法普及 let和var的区别: var:定义变量时,在全局范围内都有效;所以在变量没有声明之前就能使用,值为undefined, 称为变量提升; let:声明的变量一定要在声明后使用,而且 ...
- 启用Executor初始化线程池
前言 上文我们介绍了JDK中的线程池框架Executor.我们知道,只要需要创建线程的情况下,即使是在单线程模式下,我们也要尽量使用Executor.即: ExecutorService fixedT ...
- python build-in function
目录(?)[-] absx alliterable anyiterable basestring binx boolx callableobject chri classmethodfunction ...
- opengl中相关的计算机图形变换矩阵之:模型视图几何变换
3. 二维变换矩阵 x' a11 a12 a13 x a11x a12y a13z y' = a21 a22 a23 y = a21x a22y a2 ...
- python中加入中文注释报错处理
python中加入中文注释,运行报错如下 解决方法: 在py文件的第一行加入 #coding:utf-8 即可
- hibernate中的@GeneratedValue与@GenericGenerator
1.GeneratedValue与GenericGenerator的区别 @GeneratorValue注解----JPA通用策略生成器 @GenericGenerator注解----自定义主键生成策 ...
- hook工具
调试工具 WinDbg com/daoyuly/p/3570037 DebugDiag procexp64.exe APIMonitor OllyDBG API伴侣 FileMon v7.04 ( ...