Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Чтение блока данных неизвестной длины с помощью Tornado. [RSS Feed]

#1 Июль 16, 2013 08:13:22

ksk-
От:
Зарегистрирован: 2010-05-06
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение блока данных неизвестной длины с помощью Tornado.

Всем привет. Проблема следующая: Имеется некая готовая клиентская программа, которая взаимодействует с сервером по некоторому протоколу. Необходимо написать такой сервер. Начал писать его я использованием фреймворка Tornado. Однако, в некоторых ситуациях клиент шлёт некий блок данных, о размере которого ничего неизвестно, никаких разделителей нет, это просто блок бинарных данных. Теперь вопрос: как же мне при помощи Tornado считать такой блок??

Я делаю так:

self._stream.read_bytes(block_size, self._on_block_readed)

где block_size - размер куска блока, который я задаю вручную, self._on_block_readed - callback, который вызывается каждый раз, после получения очередных block_size байт, self._stream - объект класса tornado.iostream.IOStream.

Таким образом, если размер всего блока не кратен block_size, то даже после того, как все данные от клиента были получены, self._on_block_readed не вызывается для последнего куска, поскольку ждёт, когда считается block_size байт. Но читать-то уже нечего! Так висит в ожидании.

Вот такая проблема. Подскажите, кто может, как надо поступать в подобных случаях? Буду рад любым советам. Заранее спасибо.



Отредактировано ksk- (Июль 16, 2013 08:14:19)

Офлайн

#2 Янв. 23, 2014 15:27:24

skavans
Зарегистрирован: 2012-11-13
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение блока данных неизвестной длины с помощью Tornado.

Если никаких блоков в траффике нет - значит вам и собирать ничего не нужно из трафика на стороне сервера. Если такой режим передачи этой клиентской программы - единственный, то можно не заморачиваться с торнадо, а открыть простой сокет в отдельном потоке, который будет принимать данные порциями по 1 байту, к примеру, без таймаута и складывать их в очередь queue, к примеру. В другом потоке из этой очереди можно читать. Если данные кончились - скрипт не заблокируется, а заблокируется лишь поток с сокетом, но это не важно. Или асинхронные сокеты.

Не посмотрел на дату поста….

Отредактировано skavans (Янв. 23, 2014 15:51:33)

Офлайн

  • Начало
  • » Network
  • » Чтение блока данных неизвестной длины с помощью Tornado.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version