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 getElementsByName()的用法说明
Jul 31 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
axios学习教程全攻略
Mar 26 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
vue加载完成后的回调函数方法
Sep 07 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
PHP读取MySQL数据代码
2008/06/05 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
js Function类型
2011/12/04 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
axios基本入门用法教程
2017/03/25 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
学习python的几条建议分享
2013/02/10 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python合并同类型excel表格的方法
2018/04/01 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
django使用多个数据库的方法实例
2021/03/04 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
《藤野先生》教学反思
2014/02/19 职场文书
销售活动策划方案
2014/08/26 职场文书
离职证明标准格式
2014/09/15 职场文书
2014年教研室工作总结
2014/12/06 职场文书
企业法律事务工作总结
2015/08/11 职场文书
学生病假条范文
2015/08/17 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
各种货币符号快捷输入
2022/02/17 杂记
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers