Python: как передать массивы переменной длины по сетевому соединению - PullRequest
5 голосов
/ 27 марта 2010

Мне нужно передать массив переменной длины, в котором каждый элемент является кортежем из двух целых чисел. Как пример:

path = [(1,1),(1,2)]
path = [(1,1),(1,2),(2,2)]

Я пытаюсь использовать pack и unpack, однако, поскольку массив имеет разную длину, я не знаю, как создать такой формат, чтобы оба знали формат. Я пытался превратить его в одну строку с разделителями, например:

msg = 1&1~1&2~
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg))

на принимающей стороне:

path = unpack("s",msg)

но это просто печатает 1 в этом случае. Я также пытался отправить 4 целых числа, которые отправляют и получают нормально, при условии, что я не включаю дополнительную строку, представляющую путь.

sendMsg = pack ("hhhh", p.direction [0], p.direction [1], p.id, p.health)

на приемной стороне:

x,y,id,health = unpack("hhhh",msg)

Первый был для иллюстрации, так как я пытался отправить формат "hhhhs", но в любом случае путь не проходит должным образом.

Спасибо за вашу помощь. Я также буду смотреть на отправку двумерного массива целых, но я не могу понять, как отправить эти более «сложные» структуры по сети.

Спасибо за помощь.

Ответы [ 5 ]

7 голосов
/ 27 марта 2010

Хотя вы можете использовать упаковку и распаковку, я бы рекомендовал использовать что-то вроде YAML или JSON для передачи ваших данных.

  • Упаковка и распаковка могут привести к трудностям при отладке ошибок и несовместимости, если вы меняете интерфейс и у вас разные версии, пытающиеся связываться друг с другом.
  • Pickle может вызвать проблем безопасности , а формат pickle может меняться в разных версиях Python.

JSON включен в стандартный дистрибутив Python начиная с версии 2.6. Для YAML есть PyYAML .

1 голос
/ 27 марта 2010

Вы хотите какой-то протокол сериализации. twisted.spread предоставляет один такой (см. спецификацию Banana или документация Perspective Broker ). JSON или буферы протокола были бы более подробными примерами.

См. Также Сравнение форматов сериализации данных .

0 голосов
/ 28 марта 2010

Взгляните на xdrlib , это может помочь. Это часть стандартной библиотеки, и:

Модуль xdrlib поддерживает стандарт представления внешних данных, как описано в RFC 1014 , написанном Sun Microsystems, Inc., июнь 1987 года. Он поддерживает большинство типов данных, описанных в RFC.

0 голосов
/ 27 марта 2010

Упаковать и распаковать обязательно? Если нет, вы можете использовать JSON и YAML .

Не используйте рассол , потому что это небезопасно.

0 голосов
/ 27 марта 2010

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

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

...