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求crc32值的方法
Oct 05 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
bpython 功能强大的Python shell
Feb 16 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
Python中的heapq模块源码详析
Jan 08 Python
anaconda如何查看并管理python环境
Jul 05 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Pytorch释放显存占用方式
Jan 13 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
快速了解Python开发环境Spyder
Jun 29 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
Python开发五子棋小游戏
May 02 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
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
使javascript也能包含文件
2006/10/26 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
TensorFlow实现Batch Normalization
2018/03/08 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
python解析yaml文件过程详解
2019/08/30 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
J2EE面试题
2016/03/14 面试题
家长评语大全
2014/01/22 职场文书
个人作风建设总结
2014/10/23 职场文书
公务员考察材料范文
2014/12/23 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
JavaScript实现登录窗体
2021/06/22 Javascript
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers