Управление таймаутом сердцебиения от клиента в socket.io - программирование
Подтвердить что ты не робот

Управление таймаутом сердцебиения от клиента в socket.io

У меня есть мобильные клиенты, подключенные к серверу node.js, запускающему socket.io через xhr-опрос. У меня есть два типа клиентов:

  • Тип A

    Когда соединение распадается из-за сетевых проблем (или что клиентские сбои), время ожидания сердечного ритма по умолчанию слишком велико.

  • Тип B

    Когда соединение распадается для этого клиента, мне нужно дать ему больше время для восстановления - более важно, что клиент восстанавливается, чем сервер прерывает соединение/сеанс

Итак, мой вопрос заключается в том, как настроить (если это возможно) тайм-аут сердечного ритма от фактического клиента?

4b9b3361

Ответ 1

Насколько я могу судить, есть два значения, которые имеют значение здесь: сервер отправляет пульс клиенту каждые heartbeat interval секунды; клиент отвечает напрямую, если нет ответа, сервер решает, что клиент мертв. Клиент ждет биения с сервера за heartbeat timeout секунды с момента последнего биения (что, очевидно, должно быть выше, чем heartbeat interval). Если он не получил слово с сервера в течение heartbeat timeout секунд, он предполагает, что сервер мертв (и начнет отсоединение/повторное подключение на основе других параметров, которые вы установили).

Значения по умолчанию: heartbeat interval = 25s и heartbeat timeout = 60s. Оба элемента настроены на сервере, при подключении к клиенту отправляется heartbeat timeout.

Изменение heartbeat timeout для одного клиента легко:

var socket = io.connect(url);
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds

Однако на сервере значение heartbeat interval, по-видимому, является частью общего объекта (диспетчер - это то, что вы возвращаете из своего вызова var io = require("socket.io").listen(server)), что означает, что его нельзя легко изменить для отдельные сокеты.

Я уверен, что с некоторыми хакерскими атаками socket.io вы сможете сделать это, но вы можете сломать другие вещи в процессе...

Ответ 3

Чтобы завершить ответ Клода, вы можете установить эти значения на рычаге сервера, используя следующий код

io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);

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