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同步Import,同步调用外部js的方法
Jul 08 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
Express本地测试HTTPS的示例代码
Jun 06 Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 jQuery
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
May 21 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 19 Javascript
node.JS事件机制与events事件模块的使用方法详解
Feb 06 Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 #Javascript
游戏开发中如何使用CocosCreator进行音效处理
详解CocosCreator项目结构机制
如何使用CocosCreator对象池
Apr 14 #Javascript
You might like
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
很好用的js日历算法详细代码
2013/03/07 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
PHP PDO操作总结
2014/11/17 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Python 中的with关键字使用详解
2016/09/11 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python模拟登陆实现代码
2017/06/14 Python
python编程羊车门问题代码示例
2017/10/25 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python绘制简单彩虹图
2018/11/19 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
心理健康日活动总结
2014/05/08 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
总经理检讨书范文
2015/02/16 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫