CocosCreator通用框架设计之网络(2)

网络异常处理惩罚,好比超时时间是多久,超时后的表示是奈何的,请求时是否应该屏蔽 UI 期待处事器响应,网络断开后表示如何,自动重连照旧由玩家点击重连按钮举办重连,重连之后是否重发断网期间的动静?等等这些。

多毗连的处理惩罚,某些游戏大概需要支持多个差异的毗连,一般不会高出2个,好比一个主毗连认真处理惩罚大厅等业务动静,一个战斗毗连直接连战斗处事器,可能毗连谈天处事器。

按照上面的这些需求,我们对成果模块举办拆分,只管担保模块的高内聚,低耦合。

CocosCreator通用框架设计之网络

ProtocolHelper 协议处理惩罚模块——当我们拿到一块 buffer时,我们大概需要知道这个 buffer 对应的协议可能 id 是几多,好比我们在请求的时候就传入了响应的处理惩罚回调,那么常用的做法大概会用一个自增的 id 来区别每一个请求,可能是用协议号来区分差异的请求,这些是开拓者需要实现的。我们还需要从 buffer 中获取包的长度是几多?包长的公道范畴是几多?心跳包长什么样子等等。

Socket 模块——实现最基本的通讯成果,首先界说 Socket 的接口类 ISocket,界说如毗连、封锁、数据吸收与发送等接口,然后子类担任并实现这些接口。

NetworkTips 网络显示模块——实现如毗连中、重连中、加载中、网络断开等状态的显示,以及 UI 的屏蔽。

NetNode 网络节点——所谓网络节点,其实主要的职责是将上面的成果串联起来,为用户提供一个易用的接口。

NetManager 打点网络节点的单例——我们大概有多个网络节点(多条毗连),所以这里利用单例来举办打点,利用单例来操纵网络节点也会越发利便。

ProtocolHelper

在这里界说了一个 IProtocolHelper 的简朴接口,如下所示:

export type NetData = (string | ArrayBufferLike | Blob | ArrayBufferView);// 协议帮助接口 export interface IProtocolHelper { getHeadlen(): number; // 返回包头长度 getHearbeat(): NetData; // 返回一个心跳包 getPackageLen(msg: NetData): number; // 返回整个包的长度 checkPackage(msg: NetData): boolean; // 查抄包数据是否正当 getPackageId(msg: NetData): number; // 返回包的id或协议范例 }

Socket

在这里界说了一个 ISocket 的简朴接口,如下所示:

// Socket接口 export interface ISocket { onConnected: (event) => void; //毗连回调 onMessage: (msg: NetData) => void; // 动静回调 onError: (event) => void; // 错误回调 onClosed: (event) => void; // 封锁回调 connect(ip: string, port: number); // 毗毗邻口 send(buffer: NetData); // 数据发送接口 close(code?: number, reason?: string); // 封锁接口 }

接下来我们实现一个 WebSock,担任于 ISocket,我们只需要实现 connect、send 和 close 接口即可。send 和 close 都是对 websocket 对简朴封装,connect 则需要按照传入的 ip、端口等参数结构一个 url 来建设 websocket,并绑定 websocket 的回调。

export class WebSock implements ISocket { private _ws: WebSocket = null; // websocket工具 onConnected: (event) => void = null; onMessage: (msg) => void = null; onError: (event) => void = null; onClosed: (event) => void = null; connect(options: any) { if (this._ws) { if (this._ws.readyState === WebSocket.CONNECTING) { console.log("websocket connecting, wait for a moment...") return false; } } let url = null; if(options.url) { url = options.url; } else { let ip = options.ip; let port = options.port; let protocol = options.protocol; url = `${protocol}://${ip}:${port}`; } this._ws = new WebSocket(url); this._ws.binaryType = options.binaryType ? options.binaryType : "arraybuffer"; this._ws.onmessage = (event) => { this.onMessage(event.data); }; this._ws.onopen = this.onConnected; this._ws.onerror = this.onError; this._ws.onclose = this.onClosed; return true; } send(buffer: NetData) { if (this._ws.readyState == WebSocket.OPEN) { this._ws.send(buffer); return true; } return false; } close(code?: number, reason?: string) { this._ws.close(); } }

NetworkTips

INetworkTips 提供了很是的接口,重连和请求的开关,框架会在符合的机缘挪用它们,我们可以担任 INetworkTips 并定制我们的网络相关提示信息,需要留意的是这些接口大概会被**多次挪用**。

// 网络提示接口 export interface INetworkTips { connectTips(isShow: boolean): void; reconnectTips(isShow: boolean): void; requestTips(isShow: boolean): void; }

NetNode

NetNode 是整个网络框架中最为要害的部门,一个 NetNode 实例暗示一个完整的毗连工具,基于 NetNode 我们可以利便地举办扩展,它的主要职责有:

毗连维护

毗连的成立与鉴权(是否鉴权、如何鉴权由用户的回调抉择)

断线重连后的数据重发处理惩罚

心跳机制确保毗连有效(心跳包隔断由设置,心跳包的内容由ProtocolHelper界说)

毗连的封锁

数据发送

支持断线重传,超时重传

支持独一发送(制止同一时间反复发送)

数据吸收

支持一连监听

支持request-respone模式

界面展示

可自界说网络延迟、短线重连等状态的表示

首先我们界说了 NetTipsType、NetNodeState 两个列举,以及 NetConnectOptions 布局供 NetNode 利用。

接下来是 NetNode 的成员变量,NetNode 的变量可以分为以下几类:

NetNode 自身的状态变量,如 ISocket 工具、当前状态、毗连参数等等。

各类回调,包罗毗连、断开毗连、协议处理惩罚、网络提示等回调。

各类按时器,如心跳、重连相关的按时器。

请求列表与监听列表,都是用于吸收到的动静处理惩罚。

接下来先容网络相关的成员函数,首先看初始化与:

init 要领用于初始化 NetNode,主要是指定 Socket 与协议等处理惩罚工具。

connect 要领用于毗连处事器。

initSocket 要领用于绑定 Socket 的回调到 NetNode 中。

updateNetTips 要领用于刷新网络提示。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjfxx.html