前面说到最近在写python的一些东西,然后和另外一位小伙伴定义了协议,然后昨天我有一部分东西没理解对,昨天上午我自己重写了一遍接收和发送的全部逻辑,昨天下午补了压力测试的脚本,自测没问题之后告知联调的小伙伴。
结果上午还是出了一点问题,然后我们两对代码,他写了一个python的实现。还好最后我这边没问题。(我也害怕是我这边出问题啊,所以我自己的代码都自己检查了好几遍)
简单放一下他的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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 自定义协议的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yeshennet/article/details/77238393