Разделить пакеты Python? - PullRequest
       6

Разделить пакеты Python?

1 голос
/ 12 октября 2010

Есть ли способ, которым python может различить отправляемые пакеты? например,

Python получает данные

обрабатывает данные

клиенты отправляют первый пакет

клиент отправляет второй пакет

Python получает данные, могу ли я получить первый пакет вместо всей информации в буфере

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

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", 2000))
sock.listen(5)

все соответствующие данные сокета

Ответы [ 3 ]

1 голос
/ 12 октября 2010

Существует два основных подхода:

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

  2. Отправить какой-то специальный маркер между пакетами. Это работает, только если вы можете гарантировать, что маркер не может появиться в пакете.

Как указывает С. Лотт, вы могли бы вместо этого использовать UDP (который основан на пакетах) вместо TCP (который основан на потоках), но затем вы отказываетесь от других функций, которые предоставляет TCP (повторная передача отброшенных пакетов, последовательные пакеты и контроль перегрузки). Нетрудно написать собственный код для повторной передачи, но трудно справиться с контролем перегрузки.

0 голосов
/ 12 октября 2010

Netstring - это простой формат сериализации, используемый для отправки пакетов данных.Каждый пакет данных имеет форму «длина: данные».http://en.wikipedia.org/wiki/Netstring

Сетевые фреймворки Python, такие как twisted, имеют прямую поддержку netstring.

0 голосов
/ 12 октября 2010

Есть ли способ, которым python может различить отправляемые пакеты?

Да.Используйте UDP вместо TCP.

...