对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处理PDF的方法
Nov 10 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Sanic框架应用部署方法详解
Jul 18 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python单向链表实例详解
May 25 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 Mysql日期和时间函数集合
2007/11/16 PHP
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
python实现查询苹果手机维修进度
2015/03/16 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
企业消防安全制度
2014/02/02 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
好的促销活动方案
2014/08/21 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
三好学生个人总结
2015/02/15 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫