2011-12-13 2 views
0

Так что я должен создать протокол сообщений, который работает следующим образом:Как создать протокол сообщения

codFunc arg1 arg2... 

например:

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

Сейчас я конкатенация для отправки, и использовать string.split читать, но по нескольким причинам это не самый лучший способ.

Так что мой вопрос в том, что лучший способ создать протокол? Какие существующие протоколы следует использовать?

Спасибо.

+1

«Правильный путь» для представления PDU (блоков данных протокола) должен был бы использовать реальный формат сортировки, такой как ASN.1, Pickle или Protocol Buffers. Но если вашему протоколу нужно обрабатывать только однострочные сообщения, состоящие из целого числа, за которым следует набор строк, то будет достаточно чего-то вроде csv или того, что вы уже указали (значения, разделенные пробелами). Но формат сообщения - это всего лишь половина задания - вам все равно нужно определить сам протокол (последовательность разрешенных сообщений между участниками). – Dave

+1

В зависимости от того, насколько велики ваши сообщения, вы можете захотеть сжать их перед отправкой и распаковать их, когда вы получите их на другом конце. Вероятно, вы также захотите зашифровать сообщения. –

ответ

2

shlex, вероятно, хороший, у раскола есть проблемы с процитированными пробелами, рассол небезопасен. JSON хорош.

Я хотел бы использовать: https://www.google.com/search?gcx=c&ix=c1&sourceid=chrome&ie=UTF-8&q=bufsock ... с данными ASCII, который нулем или что-то, чтобы закрепить части протокола.

Имейте в виду, что между send() и recv() не существует отношения один к одному. Это легко успокаивается, но это может привести к проблемам надежности при сетевой нагрузке.

2

Что случилось с split, так это то, что если ваше имя пользователя содержит пробел, оно будет разделено на отдельные аргументы.

Split это один раз, чтобы получить ответственный номер функции:

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

Разбор строки в аргументы, возможно, с shlex:

import shlex 
argv = shlex.split(args) 

Удалите окружающие кавычки:

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

Позвоните своему функция:

myfunc(*argv) 
Смежные вопросы