Вопрос

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

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

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

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

Это было полезно?

Решение

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

Разные машины хранят одну и ту же информацию по-разному.Это влияет как на память, так и на сеть.Подробная информация здесь (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"

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

Другие советы

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

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

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

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

Бережливость является программной структурой для масштабируемой разработки услуг по кросс-языке.Он объединяет программный стек с двигателем генерации кода для создания услуг, которые работают эффективно и беспрепятственно между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, SmallTalk и Ocaml.

На их домашней странице есть отличный пример для начала работы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top