前言
免责声明:
本文内容仅供学习交流使用,本文章旨在学习直播间的websocket技术和protobuf协议,完善我们Chatbox,请勿用于其他用途, 如因使用本文内容而产生任何问题,后果自负,如若侵权,请联系
3215421266@qq.com删除
前文链接:
https://mp.weixin.qq.com/s/DVbc2IJ0H466OD9z6ac0Rw
先看效果
本文思维导图
通过本文你将学会
:
- ping(心跳机制)
- ACK确认机制
- gzip加密技术
之后我们就可以用python中websocketapp模块,构成websocket请求
此时运行改程序
我们在on_message里面打印,发现全打印的是二进制文件
具体原因可以看我上一期文章:https://mp.weixin.qq.com/s/DVbc2IJ0H466OD9z6ac0Rw
原因是使用了protobuf进行文件结构的构建和传输
看一下我们自己写的Chatbox
发现我们传输的时候二进制了
我们看一下某音是如何传输的
我们直接在onMessage里面打上断点,进入e方法
1.进一步进入receiveMessage方法
发现里面传的第一个数据即二进制数据
2.1在transport.decode里面解密了,进入里面
发现他断到了decodeFrameor…方法里面
我们先看一下这个函数返回值是什么
里面可以看到有一些明文数据了,也有一些如payload一样的二进制数据
而我们传进去的参数e是二进制数据,那么我们大胆猜测该数据在_decodeFrameOrResponse中进行加密(解密),
我们跟进去看看
3.0
发现t函数传入是二进制,输出却有一部分明文,跟进去看看
3.0.1
3.0.1.1继续跟进去
即发现他是怎么定义数据的,我们按照他的形式定义proto文件
其他参数也这么找
2.2发现有个ack的东东,并且websocket也发送了这个包,那么有啥用捏,点进去看看
2.2.1
返回一个自己之后发送了,经查询该ack是
ACK确认机制:
- 确保消息的可靠传递
- 让服务器知道客户端是否成功接收消息
- 维护消息的顺序性和完整性
ok,继续回到2.0后面就没啥了
我们回到1.0
1.1 onopen里面发现了ping()函数
1.1.1跟入看看
发现他也发送了这个包
查询心跳机制:
- 保持WebSocket连接活跃
- 及时发现连接断开
- 防止因网络设备(如防火墙)的超时设置导致连接被关闭
基于此我们找到了所以proto文件和机制
接下来连接websocket即可,最终效果如下图:
在本文我们通过学习某音直播弹幕技术,主要进行了一下三步:
- ping(心跳机制)
- ACK确认机制
- gzip加密技术
我们将在本系列下篇文章引入进我们的Chatbox
项目地址:https://github.com/mingheyan/Chatbox 将持续更新