Какой самый простой способ передачи данных через Интернет с использованием Python? - PullRequest
6 голосов
/ 04 февраля 2010

У меня есть два компьютера в географически распределенных местах, оба подключены к Интернету.На каждом компьютере я использую программу Python, и я хотел бы отправлять и получать данные от одного к другому.Я хотел бы использовать самый простой из возможных подходов, оставаясь при этом несколько безопасным.

Я рассмотрел следующие решения, но не уверен, какой из них самый простой:

  • HTTP-сервер и клиент, использующий protobuf *;
  • веб-сервис SOAP и клиент ( pywebsvcs возможно?);
  • Какой-то IPC поверхТуннель SSH - опять же, возможно, protobuf?

Как я уже сказал, я бы хотел, чтобы решение было несколько безопасным, но простота - это самое важное требование.Данные очень просты;объект типа A, который содержит список объектов типа B и некоторые другие поля.

* В прошлом я использовал protobuf, поэтому единственной сложностью была бы настройка HTTP-сервера, который, как мне кажется,будет вишневым.

Ответы [ 5 ]

9 голосов
/ 04 февраля 2010

Протоколные буферы «легковесны» в том смысле, что они обеспечивают очень компактное представление проводов, тем самым экономя полосу пропускания, память, хранилище и т. Д., Оставаясь при этом очень универсальными и кросс-языковыми.Конечно, мы используем их лот в Google, но неясно, заботитесь ли вы вообще об этих характеристиках производительности - вы, кажется, используете «облегченный» в совершенно ином смысле, чем тесно связанный с(умственная) нагрузка на вас, программиста, и не все с (вычислительной) нагрузкой на компьютеры и сети; -).

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

Также не является pickling, если я прочитал ваше «несколько безопасное» требованиеправильно: открепление правильно сконструированной вредоносной маринованной строки может выполнить произвольный код на машине для маринования.На самом деле HTTP не является «несколько безопасным» в несколько ином смысле: в этом протоколе нет ничего, что могло бы помешать злоумышленникам «перехватить» ваш трафик (поэтому вы никогда не должны использовать HTTP для отправки конфиденциальных полезных данных, если только вы не используете сильное шифрование наперед отправкой и отмените его после получения).Для безопасности (опять же, в зависимости от значения слова) вам нужен HTTPS или (проще настроить, не требует покупки сертификатов! -) SSH-туннели.

Как только у вас есть SSHтуннель, установленный между двумя машинами (для Python paramiko может помочь, но даже сделать это с помощью сценариев оболочки или иным образом, напрямую управляя клиентом командной строки ssh, не так уж плохо ;-) вы можете запуститьлюбой протокол на нем (например, HTTP в порядке), так как конечные точки туннеля предоставляются в виде заданных пронумерованных портов, на которых можно открыть сокет.Я бы лично рекомендовал JSON вместо XML для кодирования полезных нагрузок - см., Например, здесь для RPC-сервера и клиента на основе JSON, подобных XMLRPC, - но я предполагаю, что использование сервера и клиента XMLRPCПоставить стандартную библиотеку Python еще проще, поэтому, вероятно, ближе к тому, что вы ищете.Почему вы хотите вишни в дополнение?Производительность теперь внезапно превосходит простоту, только для этого аспекта всей архитектуры, в то время как в любом другом случае простота была выбрана выше производительности?Это казалось бы весьма противоречивым набором архитектурных решений! -)

3 голосов
/ 04 февраля 2010

Самым дешевым и простым способом передачи, вероятно, будет XML-RPC. Он работает по HTTP (так что вы можете защитить его таким образом), он находится в стандартной библиотеке и, в отличие от protobuf, вам не нужно беспокоиться о создании и компиляции файлов типов данных (поскольку оба конца работают на Python, динамическая типизация не должно быть проблемой). Единственное предостережение в том, что любые типы, не представленные в XML-RPC, должны быть обработаны или сериализованы иным образом.

1 голос
/ 04 февраля 2010

Или вы можете пойти прямо в библиотеку Sockets и просто передать данные в своем собственном формате.

http://www.amk.ca/python/howto/sockets/

0 голосов
/ 05 февраля 2010

Алекс прав, конечно.Но я хочу сказать, что в прошлом я был очень счастлив, обрабатывая данные и передавая их по SSH другому процессу для удаления.Это так просто.

Но это не подходит для многих вещей.Вам действительно нужно доверять входящим данным, которые в случае, когда мой сервер блога получает маринованную запись в блоге (мой клиент анализирует теги или тому подобное), я определенно доверяю данным - они уже аутентифицированы как я.*

Google, где работает Алекс, - это совсем другое дело.: -)

0 голосов
/ 04 февраля 2010

Вы можете рассмотреть Pyro , обязательно прочитайте главу Безопасность .

Обновление: Кажется, проще настроить, чем буферы протокола, и может потребоваться меньше работы, если ваши требования усложняются в будущем (у них есть способ сделать это ... :-)

...