2017-10-15 21 views
0

私はウェブソケットの使い方を学んでいます。私はサーバーからフロントエンドにデータを返信しています。通常はws.sendですが、同時に私はクリントがまだ生きているかどうかを調べるために、フロントエンドにpingを送信するように設定しています。コード私は現時点で使用しています。フロントエンドからの応答がない場合、私は最初のハートビートがここで私がwebsocket ping with node js

を送信した後、私はのWebSocketを終了します、わずか300秒を待ちたい

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); 
    }); 
}); 

は私のフロントエンドコードです。今起こっていただきました

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

は、私は、フロントエンドで、ブラウザを閉じたとき、私はそれをCONSOLE.LOG場合は、バックエンドでのサーバーはまだ、pingを実行されることです。あなたがここclearInterval

でタイムアウトをクリアする必要があり

+0

あなたは、クライアント 'とはどういう意味ですかいますまだ生きている? –

+0

@BrahmaDev Client(ブラウザ内) - ブラウザを閉じると、ブラウザは消えてしまいます。 –

+0

ブラウザを閉じると、WebSocketの接続も切断されます。 'ws.clients'でそれらを見つけるべきではありません。 –

答えて

0

は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); 

出力は次のようになります。

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,