在 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 的 APIwebsocket 只有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 等协议。
登岸认证流程,在利用长毗连之前我们理应举办登岸认证,而差异游戏登岸认证的方法差异。