对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 排列组合之itertools
Mar 20 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
Python给图像添加噪声具体操作
Mar 03 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python实现生成密码字典的方法示例
Sep 02 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
python如何通过twisted搭建socket服务
Feb 03 Python
django 扩展user用户字段inlines方式
Mar 30 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
使用python实现链表操作
2018/01/26 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
职工运动会邀请函
2014/01/19 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
高中学生自我评价范文
2014/09/23 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
Python+Appium实现自动抢微信红包
2021/05/21 Python