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 继承详解(四)
Jul 13 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
Bootstrap每天必学之日期控制
Mar 07 Javascript
JS上传图片预览插件制作(兼容到IE6)
Aug 07 Javascript
浅谈js数组和splice的用法
Dec 04 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
7个好用的JavaScript技巧分享(译)
May 07 Javascript
node使用request请求的方法
Dec 20 Javascript
webpack打包优化的几个方法总结
Feb 10 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
十天学会php之第一天
2006/10/09 PHP
php4的session功能评述(三)
2006/10/09 PHP
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
Python中django学习心得
2017/12/06 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python 并发下载器实现方法示例
2019/11/22 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
什么是Python中的匿名函数
2020/06/02 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
感恩父母的演讲稿
2014/05/06 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
求职自我评价范文100字
2014/09/23 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis