Тайм-аут сеанса Java WebSocket независимо от значения setMaxIdleTimeout - PullRequest
0 голосов
/ 01 мая 2018

У меня есть следующий код (конечная точка на стороне сервера WebSocket):

@OnOpen
public void open(Session session) {
    session.setMaxIdleTimeout(-1L);
    ...
}

На стороне клиента у меня есть только:

var websocket = new WebSocket("wss://dummy.org");
websocket.onmessage = onMessage;

И, тем не менее, session закрывается через 1 или 2 минуты бездействия. Я что-то здесь упускаю? Должен ли я что-то настроить на стороне клиента?

Редактировать

Я также попробовал на стороне клиента это:

websocket.onclose = reconnect;

function reconnect() {
    websocket = new WebSocket("wss://dummy.org");
    websocket.onclose = function() {
        reconnect();
    };
}

... и (конечно) это не решает проблему.

Редактировать 2

Я также пытался отправить со стороны клиента сообщение ping, на которое конечная точка отвечает сообщением pong:

(function(){
    function sendPing() {
        websocket.send("{\"action\":\"ping\"}");
        setTimeout(sendPing, 10 * 1000); // 10 seconds.
    }

    setTimeout(sendPing, 10 * 1000); // 10 seconds.
})();

1 Ответ

0 голосов
/ 06 мая 2018

Есть несколько вещей, которые могут закончиться закрытой сессией.

Одной из причин может быть веб-приложение или конфигурация контейнера. Например, если вы используете tomcat, проверьте настройку тайм-аута в файле server.xml. Или другой пример, когда nGinx отвечает за маршрутизацию соединения. Есть также некоторые конфигурации на автономных серверах веб-сокетов, в зависимости от вашей реализации, вы можете проверить их.

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

Ваша интернет-связь (если вы не проводите локальное тестирование) может быть следующей причиной сбоев соединения. Хотя обычно это можно узнать, переопределив / добавив onError(Exception e).

Есть еще одна вещь, которую вы должны реализовать, чтобы поддерживать соединения веб-сокетов: система heartbeat. Большинство стандартных библиотек веб-сокетов поддерживают ping и pong. На каждой стороне (обычно на стороне сервера) вы можете отправлять ping-кадры на другую сторону, и они автоматически отправляют обратно pong-фреймы. Это помогает поддерживать связь. Этот метод также может помочь стороне сервера понять, находится ли клиент на самом деле !!!

И, как вы уже сказали, не решайте свои проблемы, игнорируя их. Создание живого и здорового соединения через веб-сокет требует некоторых усилий и времени, чтобы справиться со многими вещами, которые, игнорируя их, приведут к большим проблемам.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...