python设计tcp数据包协议类的例子


Posted in Python onJuly 23, 2019

一. 问题描述

在tcp编程中,最需要解决的就是粘包分包问题。所以,我们需要在每个数据包前面加上数据包的长度用以分割粘连的包。

二. 包结构的设计

包的组成:包长度+数据域

包长度:用4个字节存储数据域长度,数据域长度即为其所占字节数

数据域:由若干个变量组成,如果是定长变量则不用加变量长度

定长变量:我们人为规定,传输中的int为4字节定长变量

变长变量:那就是字符串啦

文字难理解,那我就画个图吧:

python设计tcp数据包协议类的例子

上图的第一行是数据包的一个总体结构

第二行是数据域内部的一个结构(数据域的变量数量和位置都是我们自己定的,上图只是举一个例子而已)

第三行是具体变量的结构

如果不太清楚这个结构,不要紧,我们来举一个具体的例子

比如我们现在创建一个数据域是这样的数据包:

数据域:666,"你好啊","hello",888

这个数据域一共存储了四个变量,开头和结尾是两个整型变量,中间是两个字符串变量。然后我们对这个数据域构建出来的数据包是这个样子的:

python设计tcp数据包协议类的例子

这下搞明白了吧,那下面就看看怎么用python封装一个类实现上述结构的数据包的组装。

三. 代码实现

class Protocol:
 """
 规定:
 数据包头部占4字节
 整型占4字节
 字符串长度位占2字节
 字符串不定长
 """
 
 def __init__(self, bs=None):
 """
 如果bs为None则代表需要创建一个数据包
 否则代表需要解析一个数据包
 """
 if bs:
  self.bs = bytearray(bs)
 else:
  self.bs = bytearray(0)
 
 def get_int32(self):
 try:
  ret = self.bs[:4]
  self.bs = self.bs[4:]
  return int.from_bytes(ret, byteorder='little')
 except:
  raise Exception("数据异常!")
 
 def get_str(self):
 try:
  # 拿到字符串字节长度(字符串长度位2字节)
  length = int.from_bytes(self.bs[:2], byteorder='little')
  # 再拿字符串
  ret = self.bs[2:length + 2]
  # 删掉取出来的部分
  self.bs = self.bs[2 + length:]
  return ret.decode(encoding='utf8')
 except:
  raise Exception("数据异常!")
 
 def add_int32(self, val):
 bytes_val = bytearray(val.to_bytes(4, byteorder='little'))
 self.bs += bytes_val
 
 def add_str(self, val):
 bytes_val = bytearray(val.encode(encoding='utf8'))
 bytes_length = bytearray(len(bytes_val).to_bytes(2, byteorder='little'))
 self.bs += (bytes_length + bytes_val)
 
 def get_pck_not_head(self):
 return self.bs
 
 def get_pck_has_head(self):
 bytes_pck_length = bytearray(len(self.bs).to_bytes(4, byteorder='little'))
 return bytes_pck_length + self.bs
 
 
if __name__ == '__main__':
 p = Protocol()
 
 p.add_int32(666)
 p.add_str("你好啊")
 p.add_str("hello")
 p.add_int32(888)
 
 r = Protocol(p.get_pck_not_head())
 
 print(r.get_int32())
 print(r.get_str())
 print(r.get_str())
 print(r.get_int32())

代码比较简单,也不够严谨。大家可以按照自己的需求加以修改。

以上这篇python设计tcp数据包协议类的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用于返回绝对值的abs()方法
May 14 Python
Python使用gensim计算文档相似性
Apr 10 Python
Python+matplotlib实现填充螺旋实例
Jan 15 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
flask-socketio实现WebSocket的方法
Jul 31 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
Python 内存管理机制全面分析
Jan 16 Python
python基于tkinter制作无损音乐下载工具
Mar 29 Python
Django 缓存配置Redis使用详解
Jul 23 #Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 #Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
flask框架路由常用定义方式总结
Jul 23 #Python
python处理大日志文件
Jul 23 #Python
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
神经网络理论基础及Python实现详解
2017/12/15 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
python一键去抖音视频水印工具
2018/09/14 Python
Python可迭代对象操作示例
2019/05/07 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
学校先进集体事迹材料
2014/05/31 职场文书
2014年教学工作总结
2014/11/13 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
初三毕业感言
2015/07/31 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript