CocosCreator入门教程之网络通信


Posted in Javascript onApril 16, 2021

网络通信概况

开发一个网络游戏,难免要处理网络通信。有几点问题需要注意:

1.服务端为了快速开发可能前期使用http通信,后面再改成websocket/socket。

2.同时存在http和websocket/socket通信

3.通信数据格式可能需要随时替换为json或protocol buffer,可能需要添加额外头部。

4.在新手引导里使用本地数据做模拟,请求不需要发送给后端。

5.重连后数据简单同步

具体实施

针对第一、二个问题,我在设计通信模块时会考虑将通信尽量抽象为统一的对外接口,在游戏启动时通过不同的驱动器创建实例(如果只使用一种通信方式,使用单一实例)。

public constructor(driver: ConnectDriver) {
        this._driver = driver;
}

先定义通用的网络通信数据结构。其中请求分为数据和控制两种类型,用于区分心跳、登录、重连

/**
 * 请求类型
 */
export enum RequestType {
    DATA = 1,
    CTRL
}
 
/**
 * 网络通信数据结构
 */
export interface NetData {
    seq?: number; // 序列号
    mod: number; // 模块
    cmd: number; // 命令
    path?: string; // 路径
    data?: any; // 数据
    tmpData?: any; // 数据处理器临时数据
    status?: number; //状态码
    type?: RequestType;  //请求类型
}

然后定义通用的对外接口

public open(url: string, port: number, isBinary: boolean, timeout: number, retryCount: number, params: any, cb: (succ: boolean) => void): void {}
 
public close(): number {}
 
public reopen(cb: (succ: boolean) => void): void {}
 
public sendData(data: NetData, params: HttpReq | any, succCb: (data: NetData) => void, failedCb: (code: number, reason: string) => void): void {}
 
public resendNotRecv(): void {}

其中resendNotRecv用于重连后发送没有收到响应的包,后端根据序列号决定是否处理。

这里没有对推送的处理,实际上推送是接收到服务端数据后,调用广播给监听者。下面定义监听者

/**
 * 网络连接事件监听接口
 */
export interface ConnectEventListener {
    onOpen(driver: ConnectDriver);
    onClosed(driver: ConnectDriver);
    onError(driver: ConnectDriver, msg: string);
    onSendStart(driver: ConnectDriver);
    onRecvEnd(driver: ConnectDriver);
}
 
/**
 * 网络事件监听接口
 */
export interface NetEventListener extends ConnectEventListener {
    onPush(driver: ConnectDriver, data: NetData): void;
}

对外提供注册和移除接口

public addEventListener(listener: NetEventListener): void {}
 
public removeEventListener(listener: NetEventListener): void {}

针对第三个问题,需要定义一些预处理器,在发送数据前和接收到数据后,做拦截预处理。

/**
 * 网络通信数据处理器接口
 */
export interface NetDataProcessor {
    processReqData(data: any): any;
    processRespData(data: any): any;
}

对外提供添加和移除接口,这样就可以灵活定义通信数据格式

public addDataProcessor(processor: NetDataProcessor): void {}
 
public removeDataProcessor(processor: NetDataProcessor): void {}

针对第四个问题,同样是增加一个特殊的拦截器,在请求发送前对其处理,如果拦截器能处理,就不再发送给后端。

/**
 * 模拟服务器接口
 */
export interface SimServer {
    handleRequest(data: NetData): NetData;
}

对外提供设置接口

public setSimServer(server: SimServer): void {}

针对第五个问题,所有数据请求都有序列号,对请求进行记录,没有响应的请求包放到一个队列里,重连后重发这些包给后端处理

public resendNotRecv(): void {}

以上就是CocosCreator入门教程之网络通信的详细内容,更多关于CocosCreator网络通信的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
jquery处理json对象
Nov 03 Javascript
jquery实现先淡出再折叠收起的动画效果
Aug 07 Javascript
利用fecha进行JS日期处理
Nov 21 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
BootStrap Tooltip插件源码解析
Dec 27 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
Jan 23 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 Javascript
layui实现三级联动效果
Jul 26 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
JS获取父节点方法
2009/08/20 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
详细分析Python垃圾回收机制
2020/07/01 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
华为慧通面试题
2012/09/11 面试题
物理系毕业生自荐信
2013/11/01 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
餐厅总厨求职信
2014/03/04 职场文书
yy婚礼主持词
2014/03/14 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
休学证明范本
2015/06/19 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android