Page 268 - Web性能权威指南
P. 268
• 混合使用文本和二进制消息可以沟通净荷和元数据,比如用文本消息实现 HTTP
首部的功能,后跟包含应用净荷的二进制消息。
以上只列举了几种可能的策略。与 WebSocket 消息的灵活性和低延迟对应的,就是
应用逻辑必须复杂一点。不过,消息的串行化和元数据管理只是问题的一方面!
确定了消息的串行格式化,怎么保证客户端和服务器相互理解,怎么确保它们同
步呢?
好在,WebSocket 为此提供了一个简单便捷的子协议协商 API。客户端可以在初次
连接握手时,告诉服务器自己支持哪种协议:
var ws = new WebSocket('wss://example.com/socket',
['appProtocol', 'appProtocol-v2']); ➊
ws.onopen = function () {
if (ws.protocol == 'appProtocol-v2') { ➋
...
} else {
...
}
}
➊ 在 WebSocket 握手期间发送子协议数组
➋ 检查服务器选择了哪个子协议
如这个例子所示,WebSocket 构造函数可以接受一个可选的子协议名字的数组,通过
这个数组,客户端可以向服务器通告自己能够理解或希望服务器接受的协议。这个
协议数组会发送给服务器,服务器可以从中挑选一个。
如果子协议协商成功,就会触发客户端的 onopen 回调,应用可以查询 WebSocket 对
象上的 protocol 属性,从而得知服务器选定的协议。另一方面,服务器如果不支持
客户端声明的任何一个协议,则 WebSocket 握手是不完整的,此时会触发 onerror 回
调,连接断开。
子协议名由应用自己定义,且在初次 HTTP 握手期间发送给服务器。除此
之外,指定的子协议对核心 WebSocket API 不会有任何影响。
17.2 WebSocket协议
HyBi Working Group 制定的 WebSocket 通信协议(RFC 6455)包含两个高层组件:
开放性 HTTP 握手用于协商连接参数,二进制消息分帧机制用于支持低开销的基于
WebSocket | 257