2017-10-15 1 views
0

J'apprends comment utiliser les websockets. Je retourne des données à l'interface depuis le serveur via le ws.send normal mais je voudrais en même temps avoir un intervalle de temps donné pour envoyer une requête ping à l'interface pour voir si les clints sont toujours en vie là-bas. code que j'utilise en ce moment.websocket ping avec node js

ws.on('connection', function connection(ws, req) { 

    ws.on('message', function incoming(message) { 
    return_data = message; 
    heart_beat = {status:"Accepted", currentTime:"2013-02-01T20:53:32.486Z", "heartbeatInterval":300} 

    ws.send(JSON.stringify(heart_beat)); 
    const interval = setInterval(function ping() { 
    ws.clients.forEach(function each(ws) { 
     if (ws.isAlive === false) return ws.terminate(); 

     ws.isAlive = false; 
     ws.ping('', false, true); 
     }); 
    }, 300); 
    }); 
}); 

Je veux simplement attendre 300 secondes, s'il n'y a pas de réponse de la fin avant que je vais mettre fin à la websocket après le premier battement de coeur envoyer par moi

Voici mon code frontal.

ws.onopen = function(){ 
    console.log("Connected"); 
} 
ws.onclose = function(){ 
    console.log("Disconnected"); 
    ws.send('Disconnected'); 
} 

Ce qui est produit maintenant est que, quand je ferme le navigateur dans le frontal du serveur dans le back-end est encore CLIQUETIS, si je CONSOLE.LOG il.

+0

Que voulez-vous dire par 'client sont toujours vivant'? –

+0

@BrahmaDev Client (dans le navigateur) - s'ils ferment le navigateur, ils sont partis, c'est ce que je voulais dire. –

+0

Si ils ferment le navigateur, la connexion websocket est également parti. Vous ne devriez plus les trouver dans 'ws.clients'. –

Répondre

0

Vous devez effacer le délai d'attente avec clearInterval

Voici un exemple de travail avec uWebSocket:

'use strict'; 

const uws = require('uws'); 

const PORT = 3000 


/********************************************************************* 
*        Server        * 
*********************************************************************/ 

var wsServer = new uws.Server({ 'port': PORT }); 

let nextId=1; 

wsServer.on('connection', function(ws) { 
    console.log('connection !'); 

    ws.id='cnx'+nextId++; 

    ws.on('message', function(mess){console.log('message : '+mess); }); 

    ws.on('error', function(error) { 
     console.log('Cannot start server'); 
    }); 

    ws.on('close', function(code, message) { 
      console.log('Disconnection: ' + code + ', ' + message); 
      clearInterval(ws.timer); 
      }); 

    ws.on('pong',function(mess) { console.log(ws.id+' receive a pong : '+mess); }); 

    ws.timer=setInterval(function(){pingpong(ws);},1000); 

}); 

function pingpong(ws) { 
    console.log(ws.id+' send a ping'); 
    ws.ping('coucou',{},true); 
} // end of pingpong 


/********************************************************************* 
*        Client        * 
*********************************************************************/ 

var wsClient1 = createClient('client1'); 
var wsClient2 = createClient('client2'); 

function createClient(id) { 
    var client = new uws('ws://localhost:'+PORT); 
    client.id=id; 
    client.on('ping',function(mess){ console.log(this.id+' receive a ping : '+mess); }); 
    client.on('message',function(mess){ console.log(this.id+' receive a message : '+mess); }); 
    client.on('close',function(){ console.log(this.id+' closed'); }); 
    return client; 
} 

function closeClient(client) { 
    console.log('close '+client.id); client.close(); 
} 

setTimeout(function(){ closeClient(wsClient1); closeClient(wsClient2); wsServer.close(); },2500); 

sortie est:

connection ! 
connection ! 
cnx1 send a ping 
cnx2 send a ping 
client2 receive a ping : coucou 
client1 receive a ping : coucou 
cnx1 receive a pong : coucou 
cnx2 receive a pong : coucou 
cnx1 send a ping 
cnx2 send a ping 
client2 receive a ping : coucou 
client1 receive a ping : coucou 
cnx1 receive a pong : coucou 
cnx2 receive a pong : coucou 
close client1 
close client2 
client1 closed 
client2 closed 
Disconnection: 0, 
Disconnection: 0,