WebSocket 知識使用

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')

}

WebSocket 知識使用


分享到:


相關文章: