对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 struct.unpack
Sep 06 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
Python实现注册登录系统
Aug 08 Python
Python查看微信撤回消息代码
Jun 07 Python
python实现简易数码时钟
Feb 19 Python
Python中如何导入类示例详解
Apr 17 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
详解python中的异常和文件读写
Jan 03 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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
PHP文件注释标记及规范小结
2012/04/01 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
Python实现分数序列求和
2020/02/25 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
Java多态性的定义以及类型
2014/09/16 面试题
什么是继承
2013/12/07 面试题
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
往来会计岗位职责
2013/12/19 职场文书
文明礼仪事迹材料
2014/01/09 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
初中历史教学反思
2016/02/19 职场文书