zoukankan      html  css  js  c++  java
  • flask socket 握手流程

    import socket, base64, hashlib
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('127.0.0.1', 9527))
    sock.listen(5)
    # 获取客户端socket对象
    conn, address = sock.accept()
    # 获取客户端的【握手】信息
    data = conn.recv(1024)
    print(data)
    """
    GET /ws HTTP/1.1
    
    Host: 127.0.0.1:9527
    
    Connection: Upgrade
    
    Pragma: no-cache
    
    Cache-Control: no-cache
    
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
    
    Upgrade: websocket
    
    Origin: http://localhost:63342
    
    Sec-WebSocket-Version: 13
    
    Accept-Encoding: gzip, deflate, br
    
    Accept-Language: zh-CN,zh;q=0.9
    
    Cookie: session=a6f96c20-c59e-4f33-84d9-c664a2f29dfc
    
    Sec-WebSocket-Key: MAZZU5DPIxWmhk/UWL2+BA==
      # 建立连接的关键钥匙
    Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
    
    
    """
    
    # 以下动作是有websockethandler完成的
    
    
    def get_headers(data):
        header_dict = {}
        header_str = data.decode("utf8")
        for i in header_str.split("
    "):
            if str(i).startswith("Sec-WebSocket-Key"):
                header_dict["Sec-WebSocket-Key"] = i.split(":")[1].strip()
    
        return header_dict
    
    headers = get_headers(data)  # 提取请求头信息
    
    magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' # 魔法字符串 只要是websocket永远不会变
    
    value = headers['Sec-WebSocket-Key'] + magic_string # 经过请求头提取的信息和魔法字符串 合成的钥匙
    
    ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest()) # 可以理解为两次解锁 通过钥匙拿到握手验证的关键通行证
    
    # 响应信息 WebSocket-Accept:通行证
    response_tpl = "HTTP/1.1 101 Switching Protocols
    " 
                   "Upgrade:websocket
    " 
                   "Connection: Upgrade
    " 
                   "Sec-WebSocket-Accept: %s
    " 
                   "WebSocket-Location: ws://127.0.0.1:9527
    
    "
    
    response_str = response_tpl % (ac.decode('utf-8'))
    # 响应【握手】信息
    conn.send(response_str.encode("utf8")) # 向此次向你发送websocket请求的对方返回响应信息 询问是否握手通过
    
    while True:
        msg = conn.recv(8096)
        print(msg)
  • 相关阅读:
    Keepalived安装配置
    Playbook 角色(Roles) 和 Include 语句
    Ansible Playbook
    ansible的Ad-hoc命令
    Android线程简介
    宝岛探险,DFS&BFS
    再解炸弹人,dfs&bfs
    解救小哈——bfs广搜
    解救小哈——dfs深搜
    数的全排列
  • 原文地址:https://www.cnblogs.com/lzmdbk/p/10270013.html
Copyright © 2011-2022 走看看