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解析XML的几种常见方法的介绍
Apr 09 Python
python实现中文分词FMM算法实例
Jul 10 Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
python正则表达式re之compile函数解析
Oct 25 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
python挖矿算力测试程序详解
Jul 03 Python
python实现批量修改服务器密码的方法
Aug 13 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
Python使用pycharm导入pymysql教程
Sep 16 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
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php生成curl命令行的方法
2015/12/14 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python线程的两种编程方式
2015/04/14 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
详解Python的循环结构知识点
2019/05/20 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Python如何定义接口和抽象类
2020/07/28 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
SQL注入攻击的种类有哪些
2013/12/30 面试题
优秀毕业生推荐信
2013/11/02 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
校长寄语大全
2014/04/09 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
2016年中秋祝酒词
2015/11/26 职场文书