粘包待改
Posted yanhui1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了粘包待改相关的知识,希望对你有一定的参考价值。
1.TCP的模板代码
收发消息的循环 通讯循环
不断的连接客户端循环 连接循环
判断 用于判断客户端异常退出(抛异常)或close(死循环)
2.远程CMD
粘包问题
一方发送空数据 导致程序卡死 今后会通过多线程处理
3.解决粘包的方案 自定义报头
1.先用报头传输数据的长度
对于我们远程CMD程序来说 只要先传输长度就能解决粘包的问题
但是如果做得是一个文件上传下载 除了数据的长度 还需要传输文件的名字 md5等等信息
又该如何?
2.自定义复杂报头 完成发送一些额外的信息 例如文件名
1.将要发送的额外数据打包成一个字典
2.将字典转为bytes类型
3.计算字典的bytes长度 并先发送
4.发送字典数据
5.发送真实数据
服务器端示例:
# 为了方便存取 可以把需要的信息打包为一个字典
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能传的只有字节
以上是关于粘包待改的主要内容,如果未能解决你的问题,请参考以下文章