2011-12-13 171 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)