对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缩进和冒号详解
Jun 01 Python
python中的字典使用分享
Jul 31 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
python对日志进行处理的实例代码
Oct 06 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python实现五子棋人机对战游戏
Mar 25 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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 实用代码收集
2010/01/22 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
Python translator使用实例
2008/09/06 Python
用python登录Dr.com思路以及代码分享
2014/06/25 Python
python访问系统环境变量的方法
2015/04/29 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
python实现自动登录
2018/09/17 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Django的CVB实例详解
2020/02/10 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
消防安全汇报材料
2014/02/08 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
小学教师评语大全
2014/04/23 职场文书
聘任通知书
2015/09/21 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers