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

onConnected 要领在网络毗连乐成后挪用,自动进入鉴权流程(假如配置了_connectedCallback),在鉴权完成后需要挪用 onChecked 要领使 NetNode 进入可通讯的状态,在未鉴权的环境,我们不该该发送任何业务请求,但登录验证这类请求应该发送给处事器,这类请求可以通过带force参数强制发送给处事器。

吸收到任何动静城市触发 onMessage,首先会对数据包举办校验,校验的法则可以在本身的 ProtocolHelper 中实现,假如是一个正当的数据包,我们会将心跳和超时计时器举办更新——从头计时,最后在 _requests 和 _listener 中找到该动静的处理惩罚函数,这里是通过 rspCmd 举办查找的,rspCmd 是从 ProtocolHelper 的 getPackageId 取出的,我们可以将协议的呼吁可能序号返回,由我们本身来抉择请求和响应如何对应。

onError 和 onClosed 是网络堕落和封锁时挪用的,无论是否堕落,最终城市挪用 onClosed,在这里我们执行断线回调,以及做自动重连的处理惩罚。虽然也可以挪用 close来封锁套接字。close 与 closeSocket 的区别在于 closeSocket 只是封锁套接字——我仍然要利用当前的 NetNode,大概通过下一次 connect 规复网络。而 close则是排除所有的状态。

提倡网络请求有3种方法:

send 要领,纯粹地发送数据,假如当前断网可能验证中会进入 _request 行列。

request 要领,在请求的时候即以闭包的方法传入回调,在该请求的响应回到时会执行回调,假如同时有多个沟通的请求,那么这 N 个请求的响应会依次回到客户端,响应回调也会依次执行(每次只会执行一个回调)。

requestUnique 要领,假如我们不但愿有多个沟通的请求,可以利用 requestUnique 来确保每一种请求同时只会有一个。

这里确保没有反复之所以利用的是遍历 _requests,是因为我们不会积存大量的请求到 _requests中,超时或异常重发也不会导致 _requests 的积存,因为重发的逻辑是由 NetNode 节制的,并且在网络断开的环境下,我们理应屏蔽用户提倡请求,此时一般会有一个全屏遮罩——网络呈现颠簸之类的提示。

我们有2种回调,一种是前面的 request 回调,这种回调是姑且性的,一般跟着请求-响应-执行而当即清理,_listener 回调则是常驻的,需要我们手动打点的,好比打开某界面时监听、分开是封锁,可能在游戏一开始就举办监听。适合处理惩罚处事器的主动推送动静。

最后是心跳与超时相关的按时器,我们每隔 _heartTime 会发送一个心跳包,每隔 _receiveTime 检测假如没有收随处事器返回的包,则判定网络断开。

完整代码,各人可以进入源码查察!

NetManager

NetManager 用于打点 NetNode,这是由于我们大概需要支持多个差异的毗连工具,所以需要一个 NetManager 专门来打点 NetNode,同时,NetManager 作为一个单例,也可以利便我们挪用网络。

export class NetManager { private static _instance: NetManager = null; protected _channels: { [key: number]: NetNode } = {}; public static getInstance(): NetManager { if (this._instance == null) { this._instance = new NetManager(); } return this._instance; } // 添加Node,返回ChannelID public setNetNode(newNode: NetNode, channelId: number = 0) { this._channels[channelId] = newNode; } // 移除Node public removeNetNode(channelId: number) { delete this._channels[channelId]; } // 挪用Node毗连 public connect(options: NetConnectOptions, channelId: number = 0): boolean { if (this._channels[channelId]) { return this._channels[channelId].connect(options); } return false; } // 挪用Node发送 public send(buf: NetData, force: boolean = false, channelId: number = 0): boolean { let node = this._channels[channelId]; if (node) { return node.send(buf, force); } return false; } // 提倡请求,并在在功效返回时挪用指定好的回调函数 public request(buf: NetData, rspCmd: number, rspObject: CallbackObject, showTips: boolean = true, force: boolean = false, channelId: number = 0) { let node = this._channels[channelId]; if (node) { node.request(buf, rspCmd, rspObject, showTips, force); } } // 同request,但在request之前会先判定行列中是否已有rspCmd,如有反复的则直接返回 public requestUnique(buf: NetData, rspCmd: number, rspObject: CallbackObject, showTips: boolean = true, force: boolean = false, channelId: number = 0): boolean { let node = this._channels[channelId]; if (node) { return node.requestUnique(buf, rspCmd, rspObject, showTips, force); } return false; } // 挪用Node封锁 public close(code ? : number, reason ? : string, channelId: number = 0) { if (this._channels[channelId]) { return this._channels[channelId].closeSocket(code, reason); } }

测试例子

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

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