一、socket服务端 websocket_util.py
import socket
import base64
import hashlib
from threading import Thread
import struct
import copy
import json
import time
from XX.redis_db import RedisDb
from utils.summary import summary
from utils.redis_util import RedisUtil
import config
redis_db = RedisDb(config.REDIS)
redis_util = RedisUtil()
class WebSocketUtil(object):
global users
users = set()
def __init__(self, port=config.SOCKET_PORT, max_wait_user=5):
self.sock = socket.socket()
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(("0.0.0.0", port))
self.sock.listen(max_wait_user)
# 请求头转换格式为字典
def get_headers(self, data):
"""将请求头转换为字典"""
header_dict = {}
data = str(data, encoding="utf-8")
header, body = data.split("\r\n\r\n", 1)
header_list = header.split("\r\n")
for i in range(0, len(header_list)):
if i == 0:
if len(header_list[0].split(" ")) == 3:
header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[0].split(" ")
else:
k, v = header_list[i].split(":", 1)
header_dict[k] = v.strip()
return header_dict
# 等待用户连接
def socket_connect(self):
conn, addr = self.sock.accept()
users.add(conn)
# 获取握手消息,magic string ,sha1加密 发送给客户端 握手消息
data = conn.recv(8096)
headers = self.get_headers(data)
# 对请求头中的sec-websocket-key进行加密
response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \