对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实现strcmp函数功能示例
Mar 25 Python
python统计一个文本中重复行数的方法
Nov 19 Python
Python lambda和Python def区别分析
Nov 30 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python入门教程 python入门神图一张
Mar 05 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
pytorch 6 batch_train 批训练操作
May 28 Python
Python进行区间取值案例讲解
Aug 02 Python
分享3个非常实用的 Python 模块
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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
职工运动会邀请函
2014/01/19 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
入学申请自荐信范文
2014/02/26 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
年终工作总结范文2014
2014/11/27 职场文书
工商行政处罚决定书
2015/06/24 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python