Я собираюсь получить двоичный поток данных через вызов HTTP POST.
Я полагаю, что клиентская сторона работает, то есть записывает куски байтов на сервер, я вижуобъем данных, отправляемых с помощью tcpdump
, однако файлоподобный объект Twisted request.content
начинает выводить данные только после отключения клиента.
Вот как выглядит обработчик сервера:
def render(self, request):
if request.path == '/incoming-stream':
d = deferLater(reactor, 0, lambda: request)
d.addCallback(self.async_read)
return NOT_DONE_YET
def async_read(self, request):
sys.stdout.write('\nasync_read ' + str(request) + '\n')
sys.stdout.flush()
while True:
byte = request.content.read(1) # <--- read one byte
if len(byte) > 0:
sys.stdout.write(repr(byte))
sys.stdout.flush()
else:
break
sys.stdout.write('\nfinished ' + str(request) + '\n')
sys.stdout.flush()
request.write(b"finished")
request.finish()
Если я не могу сделать это с POST, у меня нет проблем с переключением на WebSocket, но сначала я хотел бы попытаться сделать это с помощью POST. Отправленные данные являются долгосрочными (один новый запрос POST каждый час, когда он активен и получает данные в течение часа), данные датчиков с относительно высокой пропускной способностью составляют приблизительно 1 кбит / с.
Я знаю, что существуют более эффективные методыпередача данных (WebSocket, MQTT, AMQP), но POST и WebSocket доставят мне наименьшее количество проблем при получении данных через конечную точку SSL NGINX. В настоящее время NGINX не используется (чтобы отменить любую буферизацию, которую он может вызвать).