对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实现神经网络感知器算法
Dec 20 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
Django多个app urls配置代码实例
Nov 26 Python
基于Python采集爬取微信公众号历史数据
Nov 27 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实现邮件发送并带有附件
2014/01/24 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
php无序树实现方法
2015/07/28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
酒店总经理岗位职责
2014/03/17 职场文书
大学生实习证明范本
2014/09/19 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis