Статус соединения WebSocket на сервере

Я использую Play Framework 2.2.1 для обработки соединений WebSocket.

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

socketIn.onClose(new F.Callback0() {
                    public void invoke() {
                             // Send a Quit message
                        }
                       });

Проблема здесь в том, что иногда в случае нежелательных событий обратный вызов onClose не вызывается. С точки зрения сервера клиент выглядит так, как будто он все еще подключен. Каков наилучший способ справиться с этой проблемой? Должен ли я пинговать клиента каждую секунду, чтобы увидеть, что он в сети, или, может быть, пинг от клиента до сервера?


person Ömer Faruk Gül    schedule 09.02.2014    source источник
comment
В вашем приложении может ли ваше соединение через веб-сокет простаивать в течение длительного времени, что означает отсутствие трафика в любом направлении в течение длительного времени?   -  person mantithetical    schedule 09.02.2014


Ответы (1)


К сожалению, простого решения нет. Вот проблема на github Play. В частности, Play не может сделать вывод, что соединение потеряно само по себе.

Пока Play не поддерживает таймауты чтения/ожидания, вы можете реализовать их самостоятельно. Наше расширение для браузера поддерживает постоянное подключение к веб-сокету, и мы запускаем проверку связи на уровне приложения каждые x секунд. И клиент, и сервер могут инициировать отключение, если линия слишком долго не использовалась.

Я не так хорошо знаком с API веб-сокетов Java, но абстрактно, вы просто хотите вести запись последнего времени связи на сервере и иметь поток/актер/запланированное задание для очистки старых соединений. Затем, чтобы сохранить соединение, запустите ping через сокет. Мы инициируем пинги на клиенте (но и на сервере тоже работает), и если сервер не пингуется в течение 2 секунд, клиент отключается и снова подключается.

person Andrew Conner    schedule 13.02.2014