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将数组插入到另一个数组中的代码
Jan 10 Javascript
JS和Jquery获取和修改label的值的示例代码
Jan 15 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
jQuery中:radio选择器用法实例
Jan 03 Javascript
使用RequireJS优化JavaScript引用代码的方法
Jul 01 Javascript
JavaScript实现向右伸出的多级网页菜单效果
Aug 25 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
AngularJS  $modal弹出框实例代码
Aug 24 Javascript
jquery,js简单实现类似Angular.js双向绑定
Jan 13 Javascript
轻松实现jQuery添加删除按钮Click事件
Mar 13 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
MYSQL数据库初学者使用指南
2006/11/16 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
php三元运算符知识汇总
2015/07/02 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
python操作xml文件示例
2014/04/07 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
Python识别html主要文本框过程解析
2020/02/18 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
python创建文本文件的简单方法
2020/08/30 Python
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
中学家长会邀请函
2014/02/03 职场文书
2015年护士节慰问信
2015/03/23 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
nginx 配置指令之location使用详解
2022/05/25 Servers