Управление таймаутом сердцебиения от клиента в socket.io
У меня есть мобильные клиенты, подключенные к серверу node.js, запускающему socket.io через xhr-опрос. У меня есть два типа клиентов:
-
Тип A
Когда соединение распадается из-за сетевых проблем (или что
клиентские сбои), время ожидания сердечного ритма по умолчанию слишком велико.
-
Тип B
Когда соединение распадается для этого клиента, мне нужно дать ему больше
время для восстановления - более важно, что клиент восстанавливается, чем
сервер прерывает соединение/сеанс
Итак, мой вопрос заключается в том, как настроить (если это возможно) тайм-аут сердечного ритма от фактического клиента?
Ответы
Ответ 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 вы сможете сделать это, но вы можете сломать другие вещи в процессе...
Ответ 2
В socket.io 1.x API изменился, но концепция осталась прежней.
Вместо heartbeatInterval и heartbeatTimeout, свойства pingInterval и pingTimeout. Например,
var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});
Смотрите документацию в http://socket.io/docs/server-api/#server(opts:object), которая направит вас на https://github.com/Automattic/engine.io#methods-1.
Ответ 3
Чтобы завершить ответ Клода, вы можете установить эти значения на рычаге сервера, используя следующий код
io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);
а затем вы можете создать 2 node.js-сервера, по одному для каждого типа клиентов (A и B), имеющих 2 желаемых набора параметров (тайм-аут и интервал сердцебиения).