Увеличьте Beast WebSockets с несколькими неопределенными записями за чтение - PullRequest
0 голосов
/ 05 мая 2018

Использование веб-сокетов boost / beast в C ++

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

Проблема, с которой я столкнулся, заключается в том, чтобы выяснить правильный подход к этой проблеме:

Интерфейс API WebSockets IBM Watson для преобразования речи в текст позволяет отправлять фрагменты аудиоданных по мере их появления (или частями из существующего файла). Однако вы не получаете текстовые ответы для каждого фрагмента.

Вместо этого вы продолжаете посылать ему аудиоданные до тех пор, пока он не распознает паузу или конец высказывания, а затем, наконец, отправляет обратно некоторые результаты.

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

Без неблокирующей функции чтения и без помещения блокирующего чтения в отдельный поток, как мне продолжать отправлять данные, а затем получать результаты только тогда, когда они доступны?

1 Ответ

0 голосов
/ 06 мая 2018

Не путайте отсутствие безопасности потоков с отсутствием полнодуплексных возможностей. Вы можете позвонить на async_read, а затем выполнить звонок на async_write. Это приведет к двум «ожидающим» асинхронным операциям. Операция записи завершится вскоре после этого, и операция чтения будет оставаться в ожидании, пока не будет получено сообщение.

Асинхронная модель Асио является «реактивной». Это означает, что ваш обработчик завершения вызывается, когда что-то происходит. Вы не «проверяете, доступны ли данные». Зверь не изобретает колесо здесь, он принимает асинхронную модель Asio. Если вы понимаете, как писать асинхронные сетевые программы с Asio, эти знания перейдут на Beast.

...