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生成随机密码
Mar 10 Python
获取Django项目的全部url方法详解
Oct 26 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
python常用函数与用法示例
Jul 02 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
pymongo insert_many 批量插入的实例
Dec 05 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
python实现图片批量压缩
Apr 24 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 18 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计算两个日期相差天数的方法
2015/03/14 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python 多进程、多线程效率对比
2020/11/19 Python
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
自荐信的五个重要部分
2013/10/29 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
服务行业标语口号
2015/12/26 职场文书
志愿服务心得体会
2016/01/15 职场文书
安全生产协议书
2016/03/22 职场文书
公司年会主持词范文!
2019/05/07 职场文书
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
2021/05/31 Python