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