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 相关文章推荐
js如何获取object类型里的键值
Feb 18 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
jQuery实现移动端滑块拖动选择数字效果
Dec 24 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
May 09 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
Jul 17 jQuery
JS非行间样式获取函数的实例代码
Jun 05 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
vue实现tab栏点击高亮效果
Aug 19 Javascript
VUE递归树形实现多级列表
Jul 15 Vue.js
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
动态新闻发布的实现及其技巧
2006/10/09 PHP
PHP简单日历实现方法
2016/07/20 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP实现验证码校验功能
2017/11/16 PHP
php取出数组单个值的方法
2018/03/12 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
英语专业应届生求职信范文
2013/11/15 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python