对python 自定义协议的方法详解

作者:雨声不在 时间:2023-05-26 07:20:04 

前面说到最近在写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之类的。

来源:https://blog.csdn.net/yeshennet/article/details/77238393

标签:python,自定义,协议
0
投稿

猜你喜欢

  • 用Python绘制一个仿黑洞图像

    2021-10-03 03:07:57
  • 用Python脚本生成Android SALT扰码的方法

    2023-05-09 22:12:25
  • PyQt实现界面翻转切换效果

    2023-12-27 04:49:46
  • python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    2021-04-23 12:41:26
  • CentOS6.5设置Django开发环境

    2022-09-29 22:55:30
  • 基于Python 函数和方法的区别说明

    2023-10-03 02:04:01
  • python使用信号量动态更新配置文件的操作

    2023-02-25 08:43:18
  • java的正则表达式你知道多少

    2022-06-09 00:09:34
  • asp提高首页性能的一个技巧

    2008-04-05 06:54:00
  • 基于ORA-19815闪回空间爆满问题的处理方法

    2024-01-21 03:35:04
  • python 正则表达式 概述及常用字符

    2023-03-03 07:16:15
  • http请求405错误方法不被允许的解决 (Method not allowed)

    2022-10-12 11:12:10
  • 如何避免SQL语句中含有单引号而导致操作失败?

    2009-11-07 18:40:00
  • SQL计算字符串中最大的递增子序列的方法

    2024-01-26 15:33:53
  • 跨浏览器让javascript文件携带图片数据

    2011-03-31 17:12:00
  • Django contrib auth authenticate函数源码解析

    2022-04-27 01:49:23
  • python 编码规范整理

    2023-05-20 10:14:44
  • 如何在 IE 中使用 HTML5 元素

    2009-06-14 19:44:00
  • 基于python3 OpenCV3实现静态图片人脸识别

    2022-10-04 20:59:30
  • python数组循环处理方法

    2023-08-03 16:36:19
  • asp之家 网络编程 m.aspxhome.com