2011-12-13 163 views
0

所以我必須創建一個消息協議的工作原理是這樣的:如何創建一個消息協議

codFunc arg1 arg2... 

例如:

0 'hello world' 
10 'user' 'password' 

現在我串聯發送,並使用string.split閱讀,但有幾個原因,這不是最好的方法。

所以我的問題是,什麼是創建協議的最佳方式?我應該使用哪些現有的協議?

謝謝。

+1

表示PDU(協議數據單元)的「正確方法」是使用真正的編組格式,如ASN.1,Pickle或Protocol Buffers。但是如果你的協議只需要處理由一個整數後跟一組字符串組成的單線消息,那麼像csv或者你已經列出的東西(空格分隔的值)就足夠了。但是消息格式只是工作的一半 - 您仍然需要定義協議本身(參與者之間允許的消息序列)。 – Dave 2011-12-13 22:32:08

回答

2

shlex可能是好的,拆分引用空白的問題,鹹菜是不安全的。 JSON很好。

我喜歡使用: https://www.google.com/search?gcx=c&ix=c1&sourceid=chrome&ie=UTF-8&q=bufsock ...用空數據結束的ASCII數據或其他東西來錨定協議的一部分。

請記住,send()和recv()之間並不總是一對一的關係。很容易對此感到自滿,但在網絡負載下它可能導致可靠性問題。

2

分裂的問題是,如果你的用戶名包含空格,它將被分解成單獨的參數。

拆分它一次獲得負責功能編號:

num, args = s.split(None, 1) 

解析字符串轉換參數,可能與shlex

import shlex 
argv = shlex.split(args) 

去除環境報價:

argv = [s.strip(shlex.quotes) for s in argv] 

打電話給你功能:

myfunc(*argv)