Найти - Пользователи
Полная версия: Чтение блока данных неизвестной длины с помощью Tornado.
Начало » Network » Чтение блока данных неизвестной длины с помощью Tornado.
1
ksk-
Всем привет. Проблема следующая: Имеется некая готовая клиентская программа, которая взаимодействует с сервером по некоторому протоколу. Необходимо написать такой сервер. Начал писать его я использованием фреймворка 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 байт. Но читать-то уже нечего! Так висит в ожидании.

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

Не посмотрел на дату поста….
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB