WebSocket为Web应用程序保留了我们所喜欢的HTTP特性(URL、安全性、基于数据模型的消息和内置的文本支持),同时提供了其他网络架构和通信模式。其是异步的,可作为高级协议(消息、聊天、服务通知等)的传输层。
每一个WebSocket连接都始于一个HTTP请求(参见Websocket原理简介),与一般请求类似,但包含一个特殊的首标-Upgrade。
WebSocket API
WebSocket API是纯事件驱动,消息和事件将在服务器发送时异步到达客户端;即只要连接打开,应用程序就可简单地监听事件。
WebSocket通过一个URL(以ws://或wss://开始)和一个可选的protocols(上层消息协议或协议列表,如XMPP、STOMP)参数构造。
var ws=new WebSocket("ws://www.websocket.org")
通过回调函数(on***),即可调度4个不同的事件:
-
open:服务器响应了WebSocket连接请求后;标示连接已建立,可收发数据了;
-
message:包含来自服务器的数据,可以是文本或二进制(Blob、ArrayBuffer);
-
error:意外故障时触发;
-
close:连接关闭时触发;事件中包含三个属性:
-
wasClean:表示连接是否顺利关闭,若由服务器端close引起,则为true;
-
code与reason表示服务器发送的关闭握手状态;
-
WebSocket两个方法:
-
send:发送一条消息(文本或二进制);若连接无效或关闭,则抛出异常;
-
close:关闭连接或连接尝试;可传递code与reason两个参数;关闭代码:
-
0~999:禁止使用(无效);
-
1000~2999:保留(WebSocket协议使用);
-
1000:正常关闭;
-
1001:离开;
-
1002:协议错误;
-
1003:不可接受的数据类型;
-
1007:无效数据;
-
1008:消息违反政策;
-
1009:消息过大;
-
1010:需要扩展;
-
1011:意外情况;
-
1015:TLS失败;
-
-
3000~3999:需要注册,用于‘程序库、框架或应用程序’,需要在IANA公开注册;
-
4000~4999:私有,自定义用途;
-
WebSocket对象特性:
-
readyState:报告连接状态:
-
0:CONNECTING,连接正在进行中;
-
1:OPEN,连接已建立;
-
2:CLOSING,连接正在关闭握手;
-
3:CLOSED,连接已关闭;
-
-
bufferedAmount:已进入缓冲队列(send完成),但还未发送到服务端的字节数;
-
protocol:服务端与客户端的协商结果,若没有则为空;
消息格式
消息在线路上是以‘组帧(framing)’表示,消息一般只有一个帧,但可由任意数量的帧组成:
WebSocket帧头包括:
-
操作码:指定消息载荷类型(4bit)
-
1:文本消息
-
2:二进制消息
-
8:关闭握手
-
9:ping
-
10:pong
-
-
长度:使用可变位数编码帧长度;
-
解码文本:8位UCS转换格式(UTF-8)编码;
-
屏蔽:浏览器发向服务器的内容,进行‘屏蔽’已混淆其内容;
-
多帧消息:通过fin位处理多帧消息或流化消息(最后一个帧fin为1);
STOMP/WS(STOMP over WebSocket)
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,面向简单(或流化)文本的消息传递协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。