Реализация двоичного протокола в Python (twisted)


Я написал TCP-сервер в узле.js, реализующий двоичный протокол. Используя буферы, это было очень легко в узле.JS. http://nodejs.org/docs/v0.5.3/api/buffers.html

Я ищу аналогичный способ реализации моего протокола в python 2.7 с помощью twisted. Однако, если есть лучший инструмент для работы, сочетающий python 3 и какой-то evented I/O, пожалуйста, дайте мне знать. Из-за объекта bytes в python 3, на первый взгляд мне кажется, что python 3 лучше справляется с двоичными файлами протоколы. Мне нужно обрабатывать много TCP(и UDP) соединения и записать немного графического интерфейса.

Вот как реализовать мой протокол в узле.js:

var buf = new Buffer(5+data.length),  //headers + data (data is also a buffer)
    action = 0x01;

buf[0] = action;
buf.writeUInt16(data.length,1,'big'); //write content length in at offset 1
buf.writeUint16(12345,5,'big');       //message identifier at offset 3
data.copy(buf,5);                     //copy data into message at offset 5

socket.write(buf);

Я был бы признателен за примеры того, как достичь подобных инструкций в python.

Edit: вот как я смог реализовать свой протокол с помощью модуля python struct:

self.transport.write(struct.pack('!bHH',action,data.length, sock_id) + data)
3 3

3 ответа:

Похоже на стандартный Python struct модуль сделает то, что вам нужно. Он позволяет точно указать, какой должна быть компоновка двоичных данных.

Возможности обработки двоичных протоколов в Python 2 и Python 3 эквивалентны.

Если вас беспокоит эффективность и вы хотите сделать что-то вроде X или целого куска байтов, вы можете посмотреть на Python bytearray, который является изменяемым массивом байтов.

Если вы хотите иметь немного больше абстракции над модулем struct, попробуйте protlib. Самое приятное, что вы можете работать с объектами python из коробки, а не с отдельными полями.