webSocket 含義
websocket是一個通過socket實現的雙工通道,可以請求響應,服務端也可以主動推送信息給客戶端。
socket 實現
服務端(socket服務端)
1、服務端開啟socket,監聽IP和端口。
3、允許連接。
5、*服務端接收到特殊的值【sha1對特殊的值、migic string="" 永遠不變的字符串,進行加密】。
6、*加密後的值發送給客戶端。
migic string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B1' 類似的16進制字符串
1
2
3
4
5
客戶端(瀏覽器)
2、客戶端發起連接請求(IP和端口)。
4、*客戶端生成一個XXX,【sha1對特殊的值、migic string="" 永遠不變的字符串,進行加密】,向服務端發送一段特殊值。
7、客戶端收到加密值,並進行對比,相同可進行通訊。
1
2
3
建立連接及收發數據
#socket服務端
import socket
import base64
import hashlib
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)
sock.bind(('127.0.0.1',8002))
sock.listen(5)
#等待用戶連接
conn,address = sock.accept()
#客戶端服務端握手消息,magic string 進行sha1加密
data = conn.recv(8096)
#將客戶端的data進行處理得到headers字典
#獲取到Sec-WebSocket-Key值
magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B1'
value = headers[Sec-WebSocket-Key] + magic_string
#加密
ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest())
#製作響應頭
response_tpl = 'HTTP/1.1 101 Switching Protocols\r\n'\
'Upgrade:websocket/r/n'\
'Connection:Upgrade\r\n'\
'Sec-WebSocket-Accept:%s\r\n'\ # 返回客戶端加密信息
'WebSocket-Location:ws://%s%s\r\n\r\n'
response_str = response_tpl%(ac.encode('utf-8'),headers['Host'],headers['url'])
#發送回客戶端
conn.send(byres(response_str,encoding='utf-8'))
info = conn.recv(8096)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 瀏覽器客戶端
ws = new WebSocket('ws://127.0.0.1:8002') //連接到服務端
// 連接成功執行onopen
ws.onopen = function(){
console.log('成功!')
ws.send('hello')
}
閱讀更多 程序員小新人學習 的文章