前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python socket websocket 三次握手 详解 服务器断开连接

python socket websocket 三次握手 详解 服务器断开连接

作者头像
onety码生
发布2018-11-21 11:37:27
2.7K0
发布2018-11-21 11:37:27
举报
文章被收录于专栏:码生码生

自己研究 socket

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

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

但是当我在 websocket 上连接时

总是服务器断开连接

然后就开始填坑

。。。

最后总结:

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

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

汗颜

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

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

代码语言:javascript
复制
 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)

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

代码语言:javascript
复制
        while True:

                data = self.connection.recv(1024)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.05.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档