1

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

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

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

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

+0

В вашем приложении, может ли ваше соединение с веб-сервером оставаться бездействующим в течение длительного времени, что означает, что в течение длительного периода трафика нет в любом направлении? – mantithetical

ответ

2

К сожалению, нет простого решения. Here's a issue about it on Play's github. В частности, Play не может сделать вывод о том, что соединение потеряно само по себе.

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

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

Смежные вопросы