CBrother脚本websocket聊天室代码分析
CBrother从1.0.7版本开始支持websocket,虽然我是做web开发的,但是websocket也还暂时没有用过,所以就学习了一下。
WebSocket比http轮询的优势
WebSocket协议简单的说就是浏览器和服务器建立长连接,全双工双向通信,服务器可以主动推送消息到浏览器,浏览器也可以主动发送消息给服务器。
比如用http协议开发一个网络聊天室如下:
如果用websocket协议开发会变成:
可以看出来,客户端不用轮询了,提高了实时性,也降低了服务器压力。
WebSocket握手过程
WebSocket协议的建立需要先借助HTTP协议,在服务器返回101状态码之后,就可以进行websocket全双工双向通信了,就没有HTTP协议什么事情了
- 浏览器先发起一个get请求
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: RCfYMqhgCo4N4E+cIZ0iPg==
Sec-WebSocket-Version: 13
Upgrade: websocket 表示我要升级协议到websocket
Connection: Upgrade 表示连接不要关闭,交给升级后的协议处理
Sec-WebSocket-Key: RCfYMqhgCo4N4E+cIZ0iPg==为客户端随机生成的一个key
Sec-WebSocket-Version: 13为协议版本号,目前来看必须是13
- 服务器回复
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: b7RAFizjwDE9lWS46ZMPfmN35wc=
HTTP/1.1 101 Switching Protocols 表示服务器同意升级协议
Upgrade: websocket 表示升级为websocket
Connection: upgrade 表示连接不要关闭,交给升级后的协议处理
Sec-WebSocket-Accept: b7RAFizjwDE9lWS46ZMPfmN35wc=
是服务器计算用客户端Sec-WebSocket-Key算出的值BASE64(SHA1(Sec-WebSocket-Key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))
- 协议升级完毕
客户端对照服务器的Sec-WebSocket-Accept,如果正确表示协议升级成功。
如果是通过https协议开始升级而来的,那么一般是wss://开头,如果是http协议开始升级而来的,那么一般是ws://开头
WebSocket协议头
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V|