存在意义:服务端可以主动向客户端推送消息。
websocket本质实现:
浏览器向服务端发送一个连接的请求。 connect
服务端接受到连接。accept
浏览器向服务端发送字符串(遵循http协议的格式)
GET /s?wd=alex Http1.1\r\nAccept-Encoding:gzip, deflate, br\r\nHost:www.baidu.com\r\nSec-WebSocket-Key:asdfsdfsdfsdfsdfsdf8sjhdfsdf\r\n\r\n
4 . 服务端接受到客户端的请求,并解析出来 “asdfsdfsdfsdfsdfsdf8sjhdfsdf”,然后得到密文的字符串
sha1(“asdfsdfsdfsdfsdfsdf8sjhdfsdf” + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11) (magic string)
再讲密文的字符串返回给浏览器(遵循http协议的格式)
HTTP/1.1 101 Switching Protocols\r\nUpgrade:websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: 密文\r\n\r\n
5 . 收发数据,存在数据加密
payload len:
<=125:报头 masking key 数据
=126:报头 masking key 数据
=127:报头 masking key 数据
位运算得到结果。
应用:
flask: geventwebsocket
django: channels