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编写基于DHT协议的BT资源爬虫
Mar 19 Python
Django接受前端数据的几种方法总结
Nov 04 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
TensorFlow实现模型评估
Sep 07 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
详解python解压压缩包的五种方法
Jul 05 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
Python调用.NET库的方法步骤
Dec 27 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
python Timer 类使用介绍
Dec 28 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
JS操作Cookies的小例子
2013/10/15 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
python logging类库使用例子
2014/11/22 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
租房协议书样本
2014/08/20 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
python中validators库的使用方法详解
2022/09/23 Python