Состояние соединения WebSocket на сервере
Я использую Play Framework 2.2.1 для обработки соединений WebSocket.
Как правило, следующая функция onClose вызывается, когда клиент либо намеренно закрывает соединение (вызывая функцию close), либо закрывается нежелательными событиями, такими как сбой клиента.
socketIn.onClose(new F.Callback0() {
public void invoke() {
// Send a Quit message
}
});
Проблема здесь в том, что иногда, в случае нежелательных событий, обратный вызов onClose не вызывается. С точки зрения сервера клиент выглядит так, как будто он все еще подключен. Каков наилучший способ справиться с этой проблемой? Должен ли я пинговать клиента, как каждую секунду, чтобы увидеть, что он в сети, или, возможно, пинг с клиента на сервер?
1 ответ
К сожалению, нет простого решения. Вот проблема об этом на github Play. В частности, Play не может сделать вывод, что соединение потеряно само по себе.
Пока Play не поддерживает тайм-ауты чтения / простоя, вы можете реализовать их самостоятельно. Наше расширение для браузера поддерживает постоянное соединение с веб-сокетом, и мы запускаем эхо-запросы на уровне приложения каждые x секунд. И клиент, и сервер могут инициировать разъединение, если линия слишком тихая.
Я не так хорошо знаком с API веб-сокета Java, но абстрактно, вы просто хотите вести учет последнего времени связи на сервере и иметь задачу потока / субъекта / запланированного для очистки старых соединений. Затем, чтобы сохранить соединение живым, запустите ping вниз по сокету. Мы инициируем эхо-запросы на клиенте (но на сервере также работает), и если сервер не работает в течение 2 секунд, клиент отключается и снова подключается.