Сервер Websocket отправляет спонтанные сообщения (без запросов от клиента)
Я должен признать, что, возможно, пропустил что-то фундаментальное. Если это так, пожалуйста, укажите это. Все, что следует, это то, как я понимаю сервер веб-сокетов.
Я пытаюсь написать сервер веб-сокетов, который должен держать клиента в курсе о состоянии выполненного задания. Существует первоначальный обмен, в котором клиент идентифицирует себя и отправляет идентификатор задания, но с этого момента клиент фактически не отправляет никаких других сообщений на сервер. Сервер, как только он узнает об обновлении в статусе своего бэкэнда, отправляет клиенту сообщение, которое реагирует соответствующим образом (обычно никаких сообщений не возвращается).
Это мой первый сервер веб-сокетов, поэтому я следовал этому примеру Microsoft в качестве ссылки: https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c
В примере реализован эхо-сервер, который отвечает на клиентские сообщения. Из-за моих разных потребностей я переписал его так, чтобы ReceiveAsync
вызывается один раз, до while
петля. Внутри цикла мой сервер проверяет свое состояние и при необходимости отправляет сообщения об обновлении.
Но если бы я должен был позвонить ReceiveAsync
в while
цикл (где моя логика сообщения обновления тоже), то цикл будет в основном заблокирован: если я await
чтобы получить сообщение, но клиент обычно не отправляет никакого сообщения, я эффективно предотвращаю переход моего сервера на следующую итерацию цикла. Поэтому я удалил вызов ReceiveAsync
Я не ожидаю сообщений, все работает нормально.
Моя проблема в том, что я не проверяю сообщения Close, потому что я звоню ReceiveAsync
только однажды. Кроме того, у меня нет действительного полного дуплекса, что сейчас хорошо, но это может измениться в будущем (или для другого проекта).
Итак, к актуальным вопросам:
1) Важно ли конкретно ждать Close
Сообщения? Или я могу предположить, что веб-сокет автоматически уничтожается при уничтожении объекта веб-сокета клиента?
2) Как реализовать полнодуплексную связь? В традиционных сокетах у меня был бы бесконечный цикл, я бы проверял, есть ли что прочитать (создать сообщение, использовать его и т. Д.), А затем, если есть что отправить клиенту, затем выполнить итерацию: если ничего нет читать я бы просто продолжил. Но ReceiveAsync
Кажется, это единственный метод для получения данных ИЛИ, чтобы проверить, есть ли какие-либо данные, и если нет данных, он просто сидит и никогда не завершается.
Должен ли я прекратить использование System.Net.Websockets
и перейти к более популярной библиотеке? Все, кого я нашел, ссылаются на "ответ" на клиентские сообщения, так что я не уверен, что они соответствуют моим потребностям (возможно, это просто случай плохих примеров и документации).