Как вы переносите двоичные данные с Python? - PullRequest
3 голосов
/ 22 апреля 2009

Я работаю над клиент-серверной программой впервые и чувствую себя совершенно неадекватно, с чего начать то, что я делаю.

Я собираюсь использовать Буферы протокола Google для передачи двоичных данных между моим клиентом и моим сервером. Я собираюсь использовать вариант Python. Как я понимаю, основная идея заключается в том, что клиент будет сериализовывать данные, отправлять их на сервер, который затем десериализует данные.

Проблема в том, что я действительно не знаю, с чего начать отправку двоичных данных на сервер. Я надеялся, что это будет что-то «простое», например HTTP-запрос, но я искал в Google способы передачи двоичных данных и терялся в огромном количестве учебников, руководств и документации. Я даже не могу сказать, лаю ли я неправильное дерево, исследуя передачи HTTP (я надеялся использовать его, так что я мог бы повысить его до HTTPS, если безопасность необходима). Я действительно не хочу переходить на уровень программирования сокетов - я хотел бы использовать доступные библиотеки, прежде чем перейти к этому. (Я бы также предпочел стандартные библиотеки Python, хотя, если будет отличная сторонняя библиотека, я буду жить.)

Так что, если у кого-то есть хорошая отправная точка (или он хочет немного объяснить) о том, как хороший способ передачи двоичных данных через Python, я был бы благодарен. Между прочим, сервер, на котором я сейчас работаю, работает под управлением Apache с mod_python.

Ответы [ 4 ]

4 голосов
/ 22 апреля 2009

Каждый раз, когда вы собираетесь переместить двоичные данные из одной системы в другую, нужно помнить о нескольких вещах.

Разные машины по-разному хранят одну и ту же информацию. Это имеет значение как в памяти, так и в сети. Более подробная информация здесь (http://en.wikipedia.org/wiki/Endianness)

Поскольку вы используете python, вы можете немного расслабиться (при условии, что клиент и сервер будут работать в python) и просто использовать cPickle для сериализации ваших данных. Если вам действительно нужен двоичный файл, вам придется освоиться с модулем структуры python (http://docs.python.org/library/struct.html). и научиться упаковывать / распаковывать данные.

Сначала я бы начал с простых серверов с линейным протоколом, пока вы не преодолеете трудности сетевого взаимодействия. Если вы никогда не делали этого раньше, это может очень быстро запутать. Как выдавать команды, как передавать данные, как выполнять синхронизацию при ошибках и т. Д. *

Если вы уже знакомы с основами проектирования протокола клиент-сервер, то попробуйте сначала упаковать и распаковать двоичные структуры на вашем диске. Я также ссылаюсь на RFC HTTP и FTP для таких случаев.

------- РЕДАКТИРОВАТЬ НА ОСНОВЕ КОММЕНТАРИЙ -------- Обычно такого рода действия выполняются путем отправки серверу «заголовка», который содержит контрольную сумму для файла, а также размер файла в байтах. Обратите внимание, что я не имею в виду заголовок HTTP, вы можете настроить его так, как хотите. Цепочка событий должна идти примерно так ...

CLIENT: "UPLOAD acbd18db4cc2f85cedef654fccc4a4d8 253521"
SERVER: "OK"
(server splits the text line to get the command, checksum, and size)
CLIENT: "010101101010101100010101010etc..." (up to 253521 bytes)
(server reasembles all received data into a file, then checksums it to make sure it matches the original)
SERVER: "YEP GOT IT"
CLIENT: "COOL CYA"

Это слишком упрощенно, но я надеюсь, что вы понимаете, о чем я говорю здесь.

3 голосов
/ 22 апреля 2009

Я не уверен, что правильно понял ваш вопрос, но, возможно, вы можете взглянуть на витой проект .

Как вы можете видеть в FAQ, «Twisted - это сетевой движок, написанный на Python, поддерживающий множество протоколов. Он содержит веб-сервер, множество клиентов чата, чат-серверов, почтовых серверов и т. Д. количество подпроектов, к которым можно получить индивидуальный доступ [...] ".

Документация довольно хорошая, и в интернете много примеров. Надеюсь, это поможет.

1 голос
/ 22 апреля 2009

Полагаю, это зависит от того, насколько вы привязаны к буферам протокола Google, но вы можете проверить Экономия .

Thrift - это программная среда для масштабируемые кросс-языковые сервисы развитие. Сочетает в себе программное обеспечение стек с механизмом генерации кода для создавать сервисы, которые работают эффективно и легко между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Какао, Smalltalk и OCaml.

На домашней странице есть отличный пример того, как начать.

0 голосов
/ 22 апреля 2009

Один быстрый вопрос: почему бинарный? Является ли сама полезная нагрузка двоичной, или вы просто предпочитаете двоичный формат? Если и раньше, то можно использовать кодировку base64 с JSON или XML; он использует больше места (~ 34%) и немного больше накладных расходов на обработку, но не обязательно достаточен для многих случаев использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...