Лучший способ отправить строковые данные с использованием пакетов Python UDP? - PullRequest
0 голосов
/ 31 октября 2011

В предисловии я очень плохо знаком с python (около 7 дней), но я опытный софтверный инженер.

Я хотел бы отправить данные между машинами, на которых запущены скрипты Python. У меня была идея (для упрощения вещей) заключаться в том, чтобы объединить данные (строки и целые числа) в строку и выполнить синтаксический анализ на стороне клиента.

UDP-пакеты прекрасно отправляются с простыми строками, но когда я пытаюсь отправить полезные данные, python всегда жалуется на данные, которые я отправляю; в частности, python не позволяет мне объединять кортежи.

  • Чтобы разобрать данные на клиенте, мне нужно отделить данные символом тире: '-'.
  • nodeList - это словарь типов, где ключ является строкой, а значение - двойным.

    randKey = random.choice( nodeList.keys() )
    data = str(randKey) +'-'+ str(nodeList[randKey])
    mySocket.sendto ( data , address ) 
    

Приведенный выше код вызывает следующую ошибку:

TypeError: приведение к Unicode: нужна строка или буфер, найден кортеж

Я не понимаю, почему он считает, что это кортеж, который я пытаюсь объединить ...

Итак, мой вопрос: как я могу исправить это, чтобы Python был доволен, или кто-то может предложить мне лучший способ отправки данных?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Я бы, вероятно, использовал модуль json для сериализации данных.

1 голос
/ 31 октября 2011

Я настоятельно рекомендую использовать для этого буфер протокола Google , реализованный в Python, как protobuf , поскольку он будет обрабатывать сериализацию на обоих концах строки.Он имеет Python привязок, которые позволят вам легко использовать его с вашей существующей программой Python.

Используя ваш пример кода, вы создадите файл .proto, например, так:

message SomeCoolMessage {
    required string key = 1;
    required double value = 2;
}

Затем после генерации вы можете использовать его так:

randKey = random.choice( nodeList.keys() )
data = SomeCoolMessage()
data.key = randKey
data.value = nodeList[randKey]
mySocket.sendto ( data.SerializeToString() , address ) 
0 голосов
/ 01 ноября 2011

Вам необходимо сериализовать данные.Pickle делает это встроенным для вас, и вы можете запросить Pickle для ascii представления данных по сравнению с двоичными данными (см. Документы), или вы можете использовать json (он также сериализует данные для вас), оба находятся в стандартной библиотеке.Но на самом деле есть сотни тысяч различных библиотек, которые выполняют ВСЕ работу за вас, при передаче данных с одной машины на другую.Я бы предложил использовать библиотеку.

В зависимости от скорости и т. Д. Для разных библиотек существуют разные компромиссы.В стандартной библиотеке вы получаете HTTP, вот и все (ну и необработанные сокеты).Но есть и другие.Если быстрая скорость важнее других вещей ..., * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100:".* rpyc обычно, это позволяет мне быть полностью ленивым и просто вызывать другие процессы в сети.Обычно это достаточно быстро.

Вы знаете, что UDP не гарантирует, что данные когда-либо будут отображаться на другой стороне, или что они будут отображаться В ПОРЯДКЕ.для твоего заявления тебя может не волновать, я не знаю, но просто подумала, что поднимешь его.

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