Python GeventWebSocket
WebSocket 介绍
什么是 WebSocket ?
WebSocket 是独立的、创建在 TCP 上的协议。
Websocket 通过 HTTP/1.1 协议的101状态码进行握手。
为了创建 Websocket
连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为 “握手)”(handshaking
)。
HTTP
是运行在TCP
协议传输层的应用协议 ,WebSocket
是通过 HTTP 协议协商如何连接,然后独立运行在TCP
协议传输层上的 应用协议。WebSocket
是一个持久化的协议,相对于HTTP
这种非持久的协议来说。
使用 Python scoket
服务端暂时只是获取
HTTP
和Websocket
请求头。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import socket
import base64
import hashlib
HOST = "127.0.0.1"
PORT = 9999
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 端口重用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
# 获取客户端的握手信息
with conn:
# print('Connected by', addr)
while True:
data = conn.recv(1024)
frmat = data.decode()
print(frmat)
if not data: break
conn.sendall(data)WebSocket 客户端代码,只做连接
1
2
3
4
5
6
7<script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:9999")
ws.onmessage = function (event) {
console.log(event.data);
};
</script>
以下为获取请求头。
原始 HTTP
请求头( 上图 ) 对比 WebSocket
+=
获取 Sec-WebSocket-Key
的值
1 |
|
请求和响应的握手信息需要遵循规则:
- 从请求握手信息中提取
S·ec-WebSocket-Key
的值 - 利用
magic_string
和Sec-WebSocket-Ke
y 的值 ,进行hmac1(sha1)
加密,再进行base64
加密 - 将结果做为
“ Sec-WebSocket-Accept”
头的值,返回给客户端。
magic_string特殊字符串 「
258EAFA5-E914-47DA-95CA-C5AB0DC85B11` 」
再来介绍一下ready state 表示的四种状态
- CONNECTING (0):表示还没建立连接;
- OPEN (1): 已经建立连接,可以进行通讯;
- CLOSING (2):通过关闭握手,正在关闭连接;
- CLOSED (3):连接已经关闭或无法打开;
客户端 接受客户端信息解密,流程
1 |
|
加密
1 |
|
完整代码示例
不再赘述
1 |
|
HTML
1 |
|
gevent 实现 websocker demo 版本
1 |
|
V2
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!