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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
python实现从web抓取文档的方法
Sep 26 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
python追加元素到列表的方法
Jul 28 Python
利用python批量检查网站的可用性
Sep 09 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Flask框架模板继承实现方法分析
Jul 31 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
Python 生成VOC格式的标签实例
Mar 10 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
django使用多个数据库的方法实例
Mar 04 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
谈谈PHP语法(3)
2006/10/09 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
Python实现包含min函数的栈
2016/04/29 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
司马光教学反思
2014/02/01 职场文书
车辆转让协议书
2014/04/15 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
小爸爸观后感
2015/06/15 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
公司备用金管理制度
2015/08/04 职场文书
毕业班工作总结
2015/08/10 职场文书