2012-10-10 28 views
14

Tengo clientes móviles conectados a un servidor node.js, ejecutando socket.io mediante xhr-polling. Tengo dos tipos de clientes:Controlar el tiempo de espera de heartbeat del cliente en socket.io

  • Tipo A

    Cuando la conexión se rompe debido a problemas en la red (o que los cliente se bloquea) el tiempo de espera de pulsación predeterminado es demasiado largo

  • tipo B

    Cuando la conexión se rompe para este cliente que necesito para darle más tiempo para recuperarse - es más importante que el cliente recupera de el servidor rompe la conexión/sesión

Así que mi pregunta es cómo puedo configurar (si es posible) los tiempos de espera de los latidos del corazón del cliente real?

+1

No estoy seguro sobre el tiempo de espera del latido del corazón, pero si está utilizando socket.io-client hay algunas opciones útiles que pueden serle útiles, como 'connect timeout'' reconnection delay' 'max reconnection's – vinayr

Respuesta

42

Por lo que puedo decir, hay 2 valores que importan aquí: el servidor envía latidos al cliente cada heartbeat interval segundos; el cliente responde directamente, si no hay respuesta, el servidor decide que el cliente está muerto. El cliente espera un latido del servidor durante heartbeat timeout segundos desde el último latido (que obviamente debería ser mayor que heartbeat interval). Si no ha recibido información desde el servidor en heartbeat timeout segundos, se asume que el servidor está muerto (y comenzará desconectar/reconectar basado en las otras opciones que haya configurado.

Los valores por defecto son heartbeat interval = 25s y heartbeat timeout = 60s. Ambos elementos son . conjunto en el servidor, el heartbeat timeout se envía al cliente al conectar

Cambio de la heartbeat timeout para un único cliente es fácil:

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

Sin embargo en el servidor, el valor heartbeat interval parece ser parte de un objeto compartido (el Administrador, que es lo que obtiene de su llamada var io = require("socket.io").listen(server)), lo que significa que no se puede cambiar fácilmente para sockets individuales.

Estoy seguro de que con un poco de Socket.IO piratería debe ser capaz de hacer que suceda, pero es posible romper otras cosas en el proceso ...

+0

thanks .. a very helpful respuesta de hecho – Charmie

+1

respuesta increíble ..... quiero dar 100 votos ... muchas gracias ... mucho ... –

+2

en lugar de ver http://stackoverflow.com/a/31146441/671457 @ respuesta de Joseph238 si ' Son del futuro como yo. – Capaj

11

Para completar la respuesta de Claude, puede establecer estos valores en la palanca de servidor, con el siguiente código

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

y entonces se podría crear 2 servidores Node.js, uno para cada tipo de cliente (a y B), que tienen de 2 conjunto deseado de opciones (tiempo de espera de los latidos del corazón y el intervalo)

+0

se puede encontrar en cualquier documentación en alguna parte? – youbetternot

+1

Lamentablemente, no he encontrado esto en ninguna documentación, que es bastante corta de todos modos. Pero en la práctica, he notado que usando el código anterior, los valores realmente cambian. – radu122

+1

Esta respuesta es válida para socket.io 0.9. *. Documentación en socket.io/lib/master.js. –

Cuestiones relacionadas