Что самый легкий путь состоит в том, чтобы передать данные по Интернету с помощью Python?

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

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

  • Сервер HTTP и клиент, с помощью protobuf*;
  • Веб-сервис SOAP и клиент (pywebsvcs, возможно?);
  • Своего рода IPC по туннелю SSH - снова, protobuf, возможно?

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

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

6
задан Nick Bolton 4 February 2010 в 13:31
поделиться

5 ответов

Это не список, а общий список, введенный для анонимного типа. Из-за этого вы не сможете записать тип явно для этой операции. Необходимо либо использовать «var newV = v.ToList ()», либо ввести его как IEnumerable, который является нестандартным интерфейсом, реализуемым в общих списках.

Ваш приведенный выше код для добавления нового предмета также может не выполнять то, что вы думаете. Сейчас это не добавление нового предмета в v , а создание нового списка, добавление предмета в этот список, а затем список исчезает, поскольку на него нет ссылок. Необходимо преобразовать v в список, а затем добавить предмет.

-121--4903925-

Если вы не можете использовать Tidy (иногда служба хостинга не активирует этот php-модуль), вы можете использовать этот PHP-класс: http://www.barattalo.it/html-fixer/

-121--4224915-

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

3
ответ дан 8 December 2019 в 18:36
поделиться

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

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

1
ответ дан 8 December 2019 в 18:36
поделиться

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

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

{{ 1}}
0
ответ дан 8 December 2019 в 18:36
поделиться

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

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

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

0
ответ дан 8 December 2019 в 18:36
поделиться

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

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

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

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

9
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: