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 相关文章推荐
jquery之empty()与remove()区别说明
Sep 10 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
Feb 12 Javascript
JS实现点击下载的小例子
Jul 10 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
Jun 16 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
JavaScript正则表达式之multiline属性的应用
Jun 16 Javascript
浅谈Jquery核心函数
Jun 18 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
jquery实现提示语淡入效果
May 05 jQuery
微信小程序表单验证功能完整实例
Dec 01 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 Javascript
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中常用的转义函数
2014/02/28 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
JavaScript中的私有成员
2006/09/18 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
python脚本实现查找webshell的方法
2014/07/31 Python
Python编程求质数实例代码
2018/01/31 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
python搜索包的路径的实现方法
2019/07/19 Python
python实现PID算法及测试的例子
2019/08/08 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python如何读写二进制数组数据
2020/08/01 Python
python如何运行js语句
2020/09/09 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
市场部岗位职责范本
2015/04/15 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python