前面說到最近在寫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