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 01 Python
python数据结构之二叉树的遍历实例
Apr 29 Python
整理Python最基本的操作字典的方法
Apr 24 Python
Python解析json文件相关知识学习
Mar 01 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
OpenCV实现人脸识别
Apr 07 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
Python面向对象类继承和组合实例分析
May 28 Python
python爬虫实例详解
Jun 19 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
Python3中列表list合并的四种方法
Apr 19 Python
python处理RSTP视频流过程解析
Jan 11 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
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
AJAX的使用方法详解
2017/04/29 PHP
jquery 使用简明教程
2014/03/05 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
python 调用Google翻译接口的方法
2020/12/09 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
什么是类的返射机制
2016/02/06 面试题
入党积极分子思想汇报
2014/01/02 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android