CocosCreator通用框架设计之网络

在 Cocos Creator 中提倡一个 http 请求是较量简朴的,但许多游戏但愿可以或许和处事器之间保持长毗连,以便处事端可以或许主动向客户端推送动静,而非老是由客户端提倡请求,对付及时性要求较高的游戏更是如此。这里我们会设计一个通用的网络框架,可以利便地应用于我们的项目中。

利用websocket

在实现这个网络框架之前,我们先相识一下 websocket。websocket 是一种基于 tcp 的全双工网络协议,可以让网页建设耐久性的毗连,举办双向的通讯。在 Cocos Creator 中利用 websocket 既可以用于 H5 网页游戏上,同样支持原生平台 Android 和 iOS。

结构 websocket 工具

在利用 websocket 时,第一步应该建设一个 websocket 工具。websocket 工具的结构函数可以传入2个参数,第一个是 url 字符串,第二个是协议字符串或字符串数组,指定了可接管的子协议,处事端需要选择个中的一个返回,才会成立毗连,但我们一般用不到。

url 参数很是重要,主要分为4部门:协议、地点、端口、资源。

好比 ws://echo.websocket.org:

协议:必选项,默认是 ws 协议,假如需要安详加密则利用 wss。

地点:必选项,可以是 ip 或域名,虽然发起利用域名。

端口:可选项,在不指定的环境下,ws 的默认端口为 80,wss 的默认端口为 443。

资源:可选性,一般是跟在域名后某资源路径,我们根基不需要它。

websocket 的状态

websocket 有4个状态,可以通过 readyState 属性查询:

0 CONNECTING 尚未成立毗连。

1 OPEN WebSocket毗连已成立,可以举办通信。

2 CLOSING 毗连正在举办封锁握手,可能该close()要领已被挪用。

3 CLOSED 毗连已封锁。

websocket 的 API

websocket 只有2个 API,void send( data ) 发送数据和 void close( code, reason ) 封锁毗连。

send 要领只吸收一个参数——即要发送的数据,范例可以是以下4个范例的任意一种:string | ArrayBufferLike | Blob | ArrayBufferView。

假如要发送的数据是二进制,我们可以通过 websocket 工具的 binaryType 属性来指定二进制的范例,binaryType 只可以被配置为“blob”或“arraybuffer”,默认为“blob”。假如我们要传输的是文件这样较为牢靠的、用于写入到磁盘的数据,利用 blob。而你但愿传输的工具在内存中举办处理惩罚则利用较为机动的 arraybuffer。假如要从其他非 blob 工具和数据结构一个 blob,需要利用 blob 的结构函数。

在发送数据时,官方有2个发起:

检测 websocket 工具的 readyState 是否为 OPEN,是才举办 send。

检测 websocket 工具的 bufferedAmount 是否为0,是才举办 send(为了制止动静会萃,该属性暗示挪用 send 后会萃在 websocket 缓冲区的还未真正发送出去的数据长度)。

close 要领吸收2个可选的参数,code 暗示错误码,我们应该传入 1000 或 3000~4999 之间的整数,reason 可以用于暗示封锁的原因,长度不行高出 123 字节。

websocket 的回调

websocket 提供了4个回调函数供我们绑定:

onopen:毗连乐成后挪用。

onmessage:有动静过来时挪用:传入的工具有 data 属性,大概是字符串、blob 或 arraybuffer。

onerror:呈现网络错误时挪用:传入的工具有 data 属性,凡是是错误描写的字符串。

onclose:毗连封锁时挪用:传入的工具有 code、reason、wasClean 等属性。

留意:当网络堕落时,会先挪用 onerror 再挪用 onclose,无论何种原因的毗连封锁,onclose 城市被挪用。

Echo 实例

下面 websocket 官网的 echo demo 的代码,可以将其写入一个 html 文件中并用欣赏器打开,打开后会自动建设 websocket 毗连,在毗连上时主动发送了一条动静“WebSocket rocks”,处事器会将该动静返回,触发 onMessage,将信息打印到屏幕上,然后封锁毗连。详细可以参考: 

默认的 url 前缀是wss,由于 wss 抽风,利用 ws 才可以毗连上,假如 ws 也抽风,可以试试连这个地点ws://121.40.165.18:8800,这是海内的一个免费测试 websocket 的网址。

 设计框架

一个通用的网络框架,在通用的前提下还需要可以或许支持各类项目标差别需求,按照履历,常见的需求差别如下:

用户协议差别,游戏大概传输 json、protobuf、flatbuffer 可能自界说的二进制协议。

底层协议差别,我们大概利用 websocket、可能微信小游戏的 wx.websocket、甚至在原生平台我们但愿利用 tcp/udp/kcp 等协议。

登岸认证流程,在利用长毗连之前我们理应举办登岸认证,而差异游戏登岸认证的方法差异。

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

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