Сервер 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 и перейти к более популярной библиотеке? Все, кого я нашел, ссылаются на "ответ" на клиентские сообщения, так что я не уверен, что они соответствуют моим потребностям (возможно, это просто случай плохих примеров и документации).

0 ответов

Другие вопросы по тегам