对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 相关文章推荐
Python3.x版本中新的字符串格式化方法
Apr 24 Python
python中的格式化输出用法总结
Jul 28 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
基于python实现文件加密功能
Jan 06 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
pytorch实现MNIST手写体识别
Feb 14 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 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
JS作用域链详解
2017/06/26 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
对Python 语音识别框架详解
2018/12/24 Python
简单了解python协程的相关知识
2019/08/31 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
校园门卫岗位职责
2013/12/09 职场文书
公务员培训心得体会
2013/12/28 职场文书
保险内勤岗位职责
2014/04/05 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
优秀员工事迹材料
2014/12/20 职场文书
辞职离别感言
2015/08/04 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS
SQLServer常见数学函数梳理总结
2022/08/05 MySQL