对python 自定义协议的方法详解


Posted in Python onFebruary 13, 2019

前面说到最近在写python的一些东西,然后和另外一位小伙伴定义了协议,然后昨天我有一部分东西没理解对,昨天上午我自己重写了一遍接收和发送的全部逻辑,昨天下午补了压力测试的脚本,自测没问题之后告知联调的小伙伴。

结果上午还是出了一点问题,然后我们两对代码,他写了一个python的实现。还好最后我这边没问题。(我也害怕是我这边出问题啊,所以我自己的代码都自己检查了好几遍)

简单放一下他的实现:

import struct
import ctypes

class E(Exception):
 def __init__(self, what):
  self.what = what

 def __str__(self):
  return self.what

def unmarshall_packet(pk):
 if len(pk) < 12:
  raise E("Invalid pk header")
 size, uri, prop_count = struct.unpack("<III", pk[:12]);
 print "size:%d uri:%d prop_count:%d" % (size, uri, prop_count)
 if len(pk) - 12 != size - 8:
  raise E("Invalid pk length")

 ss = pk[12:]
 offset = 0
 for x in range(0, prop_count):
  # Pop key
  key_size, = struct.unpack_from("<I", ss, offset)
  print "key_size:%d" % (key_size,)
  offset += 4
  key, = struct.unpack_from("<%ds" % (key_size - 1,), ss, offset)
  offset += key_size

  # Pop value 
  val_size, = struct.unpack_from("<I", ss, offset)
  offset += 4
  print "val_size:%d" % (val_size,)
  val, = struct.unpack_from("<%ds" % (val_size - 1,), ss, offset)
  offset += val_size


  print "key:%s val:%s" % (key, val)


key1 = "key1"
val1 = "val1"
key2 = "key2"
val2 = "val2"
offset = 0
ss = ctypes.create_string_buffer(9085)
struct.pack_into("<III", ss, 0, 8 + 4 + len(key1) + len(val1) + len(key2) + len(val2) + 16, 2, 2)
offset += 12
struct.pack_into("<I%dscI%dscI%dscI%dsc" % (len(key1), len(val1), len(key2), len(val2)), ss, offset, len(key1) + 1, key1, '\0', 
 len(val1) + 1, val1, '\0',
 len(key2) + 1, key2, '\0', 
 len(val2) + 1, val2, '\0')
offset += len(key1) + len(val1) + len(key2) + len(val2) + 4 + 16
unmarshall_packet(ss[:offset])

"""
hex=""
ss = bytearray.fromhex(hex)
unmarshall_packet(ss)

有很多可以学习的地方

一个是python 的 struct 对 bytearray 的操作真是舒服,直接放进去就可以了(之前我有不少东西都是徒手解的,回头再用这个优化下自己的代码吧。)

另外一个是vi写代码真是直接方便

要说缺点的话,应该是用私有协议,没有第三方工具可以作为公证,例如postman之类的。

以上这篇对python 自定义协议的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用SQLite的简单教程
Apr 29 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
Python实现多属性排序的方法
Dec 05 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
Python 3 判断2个字典相同
Aug 06 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python实现自动签到脚本功能
Aug 20 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 #Python
Python魔法方法详解
Feb 13 #Python
Python函数中不定长参数的写法
Feb 13 #Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 #Python
python调用c++传递数组的实例
Feb 13 #Python
利用ctypes获取numpy数组的指针方法
Feb 12 #Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 #Python
You might like
source.php查看源文件
2006/12/09 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
webpack5 联邦模块介绍详解
2020/07/08 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
python如何为创建大量实例节省内存
2018/03/20 Python
python计算列表内各元素的个数实例
2018/06/29 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
明信片寄语大全
2014/04/08 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
六查六看心得体会
2014/10/14 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
董事长年会致辞
2015/07/29 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python