Реализация двоичного протокола в 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 ответа:
Похоже на стандартный Python
struct
модуль сделает то, что вам нужно. Он позволяет точно указать, какой должна быть компоновка двоичных данных.Возможности обработки двоичных протоколов в Python 2 и Python 3 эквивалентны.
Если вас беспокоит эффективность и вы хотите сделать что-то вроде X или целого куска байтов, вы можете посмотреть на Python bytearray, который является изменяемым массивом байтов.
Если вы хотите иметь немного больше абстракции над модулем
struct
, попробуйтеprotlib
. Самое приятное, что вы можете работать с объектами python из коробки, а не с отдельными полями.