打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python学习笔记33:用struct模块解决tcp协议传输过程中的黏包问题

关于TCP协议容易出现的黏包问题说明可以参考:https://www.cnblogs.com/Eva-J/articles/8244551.html#_label6

本篇内容大多数也是参考上面博客学习而来,记录一下。

# struct模块:-->模块可以把一个类型,如数字,转成固定长度的bytesimport structret = struct.pack('i',4096) # 'i'代表int, 就是即将要把一个数字转换成固定长度(4个字节)的bytes类型print(ret)num = struct.unpack('i',ret) # 输出一个元组print(num[0])

使用pack可以把一个数字转化成一个固定长度(4个字节)的bytes类型,在recv的时候就可以只接收这4个字节,然后unpack解析出来就能知道接下来需要传输文件的大小。

下面展示基于TCP协议,利用struct进行的视频文件的传输过程:

server.py

# 实现一个大文件的上传或者下载# 配置文件 ip地址 端口号import socketimport structimport jsonsk = socket.socket()sk.bind(('127.0.0.1',8080))sk.listen()buffer = 4096conn,addr = sk.accept()# 接收head_len = conn.recv(4)head_len = struct.unpack('i',head_len)[0]json_head = conn.recv(head_len).decode('utf-8')head = json.loads(json_head)filesize = head['filesize']with open(head['filename'],'wb') as f:    while filesize:        if filesize >= buffer:            content = conn.recv(buffer)            f.write(content)            filesize -= buffer        else:            content = conn.recv(filesize)            f.write(content)            breakconn.close()sk.close()

client.py

# 发送端import socketimport osimport jsonimport structsk = socket.socket()sk.connect(('127.0.0.1',8080))buffer = 4096# 发送文件head = {'filepath':r'/Users/zxx/Downloads',        'filename':r'test.mp4',        'filesize':None}file_path = os.path.join(head['filepath'],head['filename'])filesize = os.path.getsize(file_path)head['filesize'] = filesizejson_head = json.dumps(head) # 字典转成了字符串bytes_head = json_head.encode('utf-8') # 字符串转bytes# print(json_head)# print(bytes_head)# 计算head的长度head_len = len(bytes_head)pack_len = struct.pack('i',head_len)# print(head_len,pack_len)sk.send(pack_len)  # 先发报头的长度sk.send(bytes_head) # 在发送bytes类型报头with open(file_path,'rb') as f:    while filesize:        if filesize >= buffer:            content = f.read(buffer)  # 每次读出来的内容            sk.send(content)            filesize -= buffer        else:            content = f.read(filesize)            sk.send(content)            breaksk.close()

先后执行完server.py 和client.py文件后,即可把本地在下载目录下面的test.mp4文件传输到python文件工作目录中。

结果如下:

来源:https://www.icode9.com/content-1-379851.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
sk_buff完全注释(skbuff.c)
R7: Evbuffers: utility functionality for buffered IO
Linux内核--网络协议栈深入分析(二)--sk_buff的操作函数2
struct和byte[]相互转换(用Marshal类实现)
【连载电子书八】Python网络编程
倒数第k个(对应节点数为n的链表)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服