PYTHON-TCP 粘包

1.TCP的模板代码
收发消息的循环 通讯循环
不断的连接客户端循环 连接循环
判断 用于判断客户端异常退出(抛异常)或close(死循环)

2.远程CMD
粘包问题
一方发送空数据 导致程序卡死 今后会通过多线程处理


3.解决粘包的方案 自定义报头
1.先用报头传输数据的长度
对于我们远程CMD程序来说 只要先传输长度就能解决粘包的问题
但是如果做得是一个文件上传下载 除了数据的长度 还需要传输文件的名字 md5等等信息
又该如何?

发送方
1.先告诉对方你要发的数据的长度
2.在发送真实数据
接收方
1.先接收数据的长度信息
2.根据长度信息循环获取直到以获取的长度等于总长度

2.自定义复杂报头 完成发送一些额外的信息 例如文件名
1.将要发送的额外数据打包成一个字典
2.将字典转为bytes类型
3.计算字典的bytes长度 并先发送
4.发送字典数据
5.发送真实数据

struct
整型转字节,转成的bytes是固定长度的
i 表示int 长度为4字节 q表示long int 长度为8字节
print(len(struct.pack("i",10240)))
字节转整型 得到一个元祖!!!
print(struct.unpack("q",struct.pack("q",10240))[0])

服务器端示例:
# 为了方便存取 可以把需要的信息打包为一个字典
dic{
"filename":"仓老师视频教学 如何做炸鸡!",
"md5":"xzxbzxkbsa1212121",
"total_size":2121221
}
# 字典转字符串? json
head_dic = str(dict)
bytes = head_dic.encode("utf-8")
# 先发送这个字典字符串的长度
dic_len = len(head_dic)
#将长度转为了 字节
bytes_len = struct.pack("i",dic_len)
# 发送报头的长度
c.send(bytes_len)

# 发送真实数据
c.send(xxx.mp4.bytes)
TCP能传的只有字节

猜你喜欢

转载自www.cnblogs.com/du-jun/p/9931520.html
今日推荐