对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多线程threading.Lock锁用法实例
Nov 01 Python
使用Python的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
python 回调函数和回调方法的实现分析
Mar 23 Python
Python切换pip安装源的方法详解
Nov 18 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
深入理解pytorch库的dockerfile
Jun 10 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
Python简单定义与使用二叉树示例
2018/05/11 Python
python matlibplot绘制3D图形
2018/07/02 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
南京某公司笔试题
2013/01/27 面试题
百度吧主申请感言
2014/01/12 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
黄山导游词
2015/01/31 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL