美文网首页
python socket websocket 三次握手 详解

python socket websocket 三次握手 详解

作者: wangtieshan | 来源:发表于2018-05-31 14:14 被阅读0次

    自己研究 socket

    然后按照度娘上和官方文档的那样起了一个服务

    然后用 Python 写了一个客户端,然后可以连接成功

    但是当我在 websocket 上连接时

    总是服务器断开连接

    然后就开始填坑

    。。。

    最后总结:

    Python 客户端连接 python 服务端不需要处理三次握手

    而 websocket 连接时需要处理三次握手

    汗颜

    第一次收到请求时,是需要处理三次握手的

    下面代码都是有详细注释的

     data = self.connection.recv(1024)
    
    print 'first get data %s ' % data
    
    headers = self.parse_headers(data)
    
    token = self.generate_token(headers['Sec-WebSocket-Key'])
    
            self.connection.send('\
    HTTP/1.1 101 WebSocket Protocol Hybi-10\r\n\
    Upgrade: WebSocket\r\n\
    Connection: Upgrade\r\n\
    Sec-WebSocket-Accept: %s\r\n\r\n' % token)
    
    
    
    ######## 辅助方法
    
    def parse_data(self, msg):
    
            if len(msg) == 0:
                return  ''
    
            # 去除二进制中的第1位
            v = ord(msg[1]) & 0x7f
    
            # p 掩码的开始位
    
            # 1位如果是 126 表接下来的两个字节才是长度
            # 接下来两个是长度,加上0位和1位,就是 4 位开始掩码
            if v == 0x7e:
                p = 4
    
            # 1位 127 表接下来的八个字节才是长度
            # 接下来 8 个代表长度,加上 0 and 1 则是 10 开始掩码
            elif v == 0x7f:
                p = 10
    
            # 1 位 1-125 则本身代表长度
            # 0 and 1 则 2 开始掩码
            else:
                p = 2
    
            # mark 掩码为包长之后的 4 个字节
            mask = msg[p:p + 4]
            data = msg[p + 4:]
    
            #print 'mask num is \n %s' % [ord(v) for v in mask]
    
            #print 'mask little num is \n %s' % [ord(v) & 0x7f for v in mask]
    
            #print 'mask is \n %s' % [chr(ord(v) & 0x7f) for v in mask]
    
            ori = ''.join([chr(ord(v) ^ ord(mask[k % 4])) for k, v in enumerate(data)])
    
            print 'origin data is \n %s' % ori
    
            return ori
    
        def parse_headers(self, msg):
            headers = {}
            header, data = msg.split('\r\n\r\n', 1)
            for line in header.split('\r\n')[1:]:
                key, value = line.split(': ', 1)
                headers[key] = value
            headers['data'] = data
            return headers
    
        def generate_token(self, msg):
            key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
            ser_key = hashlib.sha1(key).digest()
            return base64.b64encode(ser_key)
    
    

    经过上面的处理就可以正常的发送和接收数据了

            while True:
    
                    data = self.connection.recv(1024)
    

    相关文章

      网友评论

          本文标题:python socket websocket 三次握手 详解

          本文链接:https://www.haomeiwen.com/subject/gtyqsftx.html