python 用struct模块解决黏包问题


Posted in Python onNovember 07, 2020

为什么会出现黏包现象:

首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候容易出现黏包现象。本质还是因为我们在接收数据的时候不知道发送的数据的长短。

解决黏包问题

在传输大量数据之前首先告诉接收端要发送的数据大小,如果想更漂亮的解决问题,可以通过struct模块来定制协议。

struct模块:

功能:可以把一个类型,如数字,转成固定长度的bytes。

import struct

ret = struct.pack('i',456872783)   #'i'代表int,就是即将要把一共数字转换成固定长度(4个字节)的bystes类型
print(ret)

num = struct.unpack('i',ret)  #转换回来,返回一个元组
print(num[0])  #提前元组中的值得到4096

解决黏包问题:

服务端:

import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr = sk.accept()
while True:
  cmd = input('>>>')
  if cmd == 'q':   #当输入‘q'时,结束,并向客户端发送一个'q'。
    conn.send(b'q')
    break
  conn.send(cmd.encode('gbk'))  #将输入的cmd命令发送给客户端
  num = conn.recv(4)   #接收字节信息(返回的消息长度信息)。
  num = struct.unpack('i',num)[0]   #将接收的字节码转化为原来的类型并放在一个元组里面,后面加[0]是提前出元组中的值。
  res = conn.recv(int(num)).decode('gbk')   #接收长度为num 的消息。
  print(res)   #打印
conn.close()
sk.close()

客户端:

import struct
import socket
import subprocess

sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
  cmd = sk.recv(1024).decode('gbk')  #接收服务端发送来的cmd命令
  if cmd == 'q': #当接收到‘q'时,结束。
    break
  # 在客户端执行接收到的cmd命令。并将正确的消息和错误的消息分别放入stdout和stderr管道。
  res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  std_out = res.stdout.read()   #读取管道内正确的消息
  std_err = res.stderr.read()   #读取管道内错误的消息
  len_num = len(std_out)+len(std_err)   #计算正确和错误消息的总长度
  num_by = struct.pack('i',len_num)    #将消息总长度转换成长度为4的字节码
  sk.send(num_by)   #发送消息长度信息
  sk.send(std_out)  #发送正确消息
  sk.send(std_err)   #发送错误消息

sk.close()

以上就是python 用struct模块解决黏包问题的详细内容,更多关于python struct模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python抓取豆瓣图片并自动保存示例学习
Jan 10 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
python简单实现操作Mysql数据库
Jan 29 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
python利用platform模块获取系统信息
Oct 09 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
python hmac模块验证客户端的合法性
Nov 07 #Python
python如何利用paramiko执行服务器命令
Nov 07 #Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 #Python
如何使用Django Admin管理后台导入CSV
Nov 06 #Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 #Python
python两种获取剪贴板内容的方法
Nov 06 #Python
用python写一个带有gui界面的密码生成器
Nov 06 #Python
You might like
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python数组条件过滤filter函数使用示例
2014/07/22 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python微信公众号开发平台
2018/01/25 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Python中的全局变量如何理解
2020/06/04 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
python实现简单猜单词游戏
2020/12/24 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
如何理解transaction事务的概念
2015/05/27 面试题
公证书标准格式
2014/04/10 职场文书
党风廉设责任书
2014/04/16 职场文书
导师工作推荐信
2015/03/27 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技