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 相关文章推荐
javaScript Array(数组)相关方法简述
Jul 25 Javascript
jquery操作checkbox示例分享
Jul 21 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
Sep 06 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
微信扫码支付零云插件版实例详解
Apr 26 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
Bootstrap datepicker日期选择器插件使用详解
Jul 26 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
vue计算属性+vue中class与style绑定(推荐)
Mar 30 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
PHP中的日期处理方法集锦
2007/01/02 PHP
Yii框架form表单用法实例
2014/12/04 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
详解Swift中属性的声明与作用
2016/06/30 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
软件测试工程师结构化面试题库
2016/11/23 面试题
美术专业学生个人自我评价
2013/09/19 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
python实现Thrift服务端的方法
2021/04/20 Python
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS