web-dev-qa-db-fra.com

Contrôle du délai d'attente de pulsation à partir du client dans socket.io

J'ai des clients mobiles connectés à un serveur node.js, exécutant socket.io via xhr-polling. J'ai deux types de clients:

  • Type A

    Lorsque la connexion est interrompue en raison de problèmes de réseau (ou que le client se bloque), le délai par défaut du rythme cardiaque est trop long

  • Type B

    Lorsque la connexion est rompue pour ce client, je dois lui donner plus de temps pour récupérer - il est plus important que le client récupère que le serveur ne coupe la connexion/session

Donc, ma question est de savoir comment configurer (si cela est possible) les délais d'attente de pulsation du client réel?

24
Martin

Autant que je sache, il y a 2 valeurs qui importent ici: le serveur envoie des pulsations au client toutes les heartbeat interval Secondes; le client répond directement, s'il n'y a pas de réponse, le serveur décide que le client est mort. Le client attend un battement de cœur du serveur pendant heartbeat timeout Secondes depuis le dernier battement de cœur (qui devrait évidemment être supérieur au heartbeat interval). S'il n'a pas reçu Word du serveur en heartbeat timeout Secondes, il suppose que le serveur est mort (et commencera à se déconnecter/se reconnecter en fonction des autres options que vous avez définies.

Les valeurs par défaut sont heartbeat interval = 25s Et heartbeat timeout = 60s. Les deux éléments sont définis sur le serveur, le heartbeat timeout Est envoyé au client lors de la connexion.

Changer le heartbeat timeout Pour un seul client est simple:

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

Cependant sur le serveur, la valeur heartbeat interval Semble faire partie d'un objet partagé (le Manager, qui est ce que vous récupérez de votre appel var io = require("socket.io").listen(server)), ce qui signifie qu'il ne peut pas facilement changer pour les prises individuelles.

Je suis sûr qu'avec un piratage de socket.io, vous devriez pouvoir y arriver, mais vous pourriez casser d'autres choses dans le processus ...

55
Claude

Dans socket.io 1.x, l'API a changé mais le concept reste le même.

Au lieu de heartbeatInterval et heartbeatTimeout, les propriétés sont pingInterval et pingTimeout. Par exemple,

var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});

Voir la documentation sur http://socket.io/docs/server-api/#server (opts: object) , qui vous dirigera vers https://github.com/ Automattic/engine.io # méthodes-1 .

24
Joseph238

Pour compléter la réponse de Claude, vous pouvez définir ces valeurs au niveau du levier du serveur, avec le code suivant

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

puis vous pouvez créer 2 serveurs node.js, un pour chaque type de client (A et B), avec 2 jeux d'options souhaités (délai d'attente et intervalle).

11
radu122