Сервер Websocket отправляет спонтанные сообщения (без запросов от клиента) - PullRequest
0 голосов
/ 13 июня 2018

Я должен признать, что, возможно, упустил что-то фундаментальное.Если это так, пожалуйста, укажите это.Все, что следует, это то, как я понимаю сервер веб-сокетов.

Я пытаюсь написать сервер веб-сокетов, который должен держать клиента в курсе состояния выполненного запроса.Существует первоначальный обмен, в котором клиент идентифицирует себя и отправляет идентификатор задания, но с этого момента клиент фактически не отправляет никаких других сообщений на сервер.Сервер, как только он узнает об обновлении в статусе своего бэкэнда, отправляет клиенту сообщение, которое реагирует соответствующим образом (обычно никаких сообщений не возвращается).

Это мой первый сервер веб-сокетов, поэтому я следовал этому примеру Microsoft в качестве справки: https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c

В примере реализован эхо-сервер, который отвечает на клиентские сообщения.Из-за моих разных потребностей я переписал его так, чтобы вызов ReceiveAsync вызывался один раз, перед циклом while.Внутри цикла мой сервер проверяет свое состояние и при необходимости отправляет сообщения об обновлении.

Но, если бы я должен был вызвать ReceiveAsync в цикле while (где тоже есть логика моего обновления сообщения), тогда цикл был бы в основном заблокирован: если я await получу сообщение,но клиент обычно не отправляет никаких сообщений, я эффективно предотвращаю переход моего сервера на следующую итерацию цикла.Поэтому я удалил вызов ReceiveAsync: я не ожидаю сообщений, все работает нормально.

Моя проблема в том, что я не проверяю сообщения Close, потому что я звоню ReceiveAsync только один раз.Кроме того, у меня нет действительного полного дуплекса, что сейчас хорошо, но это может измениться в будущем (или для другого проекта).

Итак, к актуальным вопросам:

1) Важно ли специально ждать Close сообщений? Или я могу предположить, что веб-сокет автоматически отключается, когдаобъект websocket клиента уничтожен?

2) Как реализовать полнодуплексную связь? В традиционных сокетах у меня был бы бесконечный цикл, я бы проверял, есть ли что-точитать (создать сообщение, использовать его и т. д.), а затем, если есть что отправить клиенту, выполнить итерацию: если нечего читать, я бы просто продолжил.Но ReceiveAsync, кажется, единственный метод для получения данных ИЛИ для проверки наличия каких-либо данных, и если данных нет, он просто сидит и никогда не завершается.

Должен ли я прекратить использование System.Net.Websockets и перейти к более популярной библиотеке?Все, кого я нашел, ссылаются на «ответ» на клиентские сообщения, поэтому я не уверен, что они соответствуют моим потребностям (возможно, это просто случай плохих примеров и документации).

...