對(duì)python 自定義協(xié)議的方法詳解
前面說到最近在寫python的一些東西,然后和另外一位小伙伴定義了協(xié)議,然后昨天我有一部分東西沒理解對(duì),昨天上午我自己重寫了一遍接收和發(fā)送的全部邏輯,昨天下午補(bǔ)了壓力測(cè)試的腳本,自測(cè)沒問題之后告知聯(lián)調(diào)的小伙伴。
結(jié)果上午還是出了一點(diǎn)問題,然后我們兩對(duì)代碼,他寫了一個(gè)python的實(shí)現(xiàn)。還好最后我這邊沒問題。(我也害怕是我這邊出問題啊,所以我自己的代碼都自己檢查了好幾遍)
簡(jiǎn)單放一下他的實(shí)現(xiàn):
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)
有很多可以學(xué)習(xí)的地方
一個(gè)是python 的 struct 對(duì) bytearray 的操作真是舒服,直接放進(jìn)去就可以了(之前我有不少東西都是徒手解的,回頭再用這個(gè)優(yōu)化下自己的代碼吧。)
另外一個(gè)是vi寫代碼真是直接方便
要說缺點(diǎn)的話,應(yīng)該是用私有協(xié)議,沒有第三方工具可以作為公證,例如postman之類的。
以上這篇對(duì)python 自定義協(xié)議的方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python正則表達(dá)式re.search()用法詳解
re是Python中最常見的正則表達(dá)式模塊,常用方法包括compile,match,findall,finditer,search,split,sub等,下面這篇文章主要給大家介紹了關(guān)于Python正則表達(dá)式re.search()用法詳解的相關(guān)資料,需要的朋友可以參考下2022-09-09
淺述python中argsort()函數(shù)的實(shí)例用法
本篇文章主要介紹了淺述python中argsort()函數(shù)的實(shí)例用法,詳細(xì)的介紹了argsort()函數(shù)的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式
這篇文章主要介紹了Python 通過監(jiān)聽端口實(shí)現(xiàn)唯一腳本運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python百行代碼自制電腦端網(wǎng)速懸浮窗的實(shí)現(xiàn)
這篇文章主要介紹了python百行代碼自制電腦端網(wǎng)速懸浮窗的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
flask框架自定義過濾器示例【markdown文件讀取和展示功能】
這篇文章主要介紹了flask框架自定義過濾器,結(jié)合實(shí)例形式分析了flask基于自定義過濾器實(shí)現(xiàn)markdown文件讀取和展示功能相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
Django用戶認(rèn)證系統(tǒng) Web請(qǐng)求中的認(rèn)證解析
這篇文章主要介紹了Django用戶認(rèn)證系統(tǒng) Web請(qǐng)求中的認(rèn)證解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

