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 精粹读书笔记(1,2)
Feb 07 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
javascript中常用编程知识
Apr 08 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
Dec 20 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
JS性能优化实现方法及优点进行
Aug 30 Javascript
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
php中关于换行的实例写法
2019/09/26 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
python实现键盘输入的实操方法
2019/07/16 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
结构和类有什么异同
2012/07/16 面试题
见习期自我鉴定
2013/11/07 职场文书
初中生物教学反思
2014/01/10 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers