2017-07-11 4 views
1

Je suis en train de communiquer la communication client-serveur utilisant le protocole TCP-IP dans le nœud jsPourquoi le serveur tcp noeud ne détecte pas client déconnecté

Ci-dessous mon code côté serveur et j'ai un appareil GSM qui agit en tant que client. Lorsque le périphérique GSM se connecte au serveur, je reçois le message que l'appareil est connecté! mais quand je coupe l'alimentation du dispositif GSM alors le serveur devrait reconnaître que l'appareil est déconnecté mais aucun message ne s'affiche à l'écran même si j'ai le code pour l'événement de déconnexion.

code serveur

// Load the TCP Library 
net = require('net'); 

// Keep track of the chat clients 
var clients = []; 

// Start a TCP Server 
net.createServer(function (socket) { 

// Identify this client 
socket.name = socket.remoteAddress + ":" + socket.remotePort 

// Put this new client in the list 
clients.push(socket); 

// Send a nice welcome message and announce 
socket.write("Welcome " + socket.name + "\n"); 
broadcast(socket.name + " Device is connected!\n", socket); 

// Handle incoming messages from clients. 
socket.on('data', function (data) { 
broadcast(socket.name + "> " + data, socket); 
}); 

// Remove the client from the list when it leaves 
socket.on('end', function() { 
clients.splice(clients.indexOf(socket), 1); 
broadcast(socket.name + " Device left.\n"); 
}); 

// Send a message to all clients 
function broadcast(message, sender) { 
clients.forEach(function (client) { 
    // Don't want to send it to sender 
    if (client === sender) return; 
    client.write(message); 
    }); 
    // Log it to the server output too 
    process.stdout.write(message) 
    } 

    }).listen(5000); 

    // Put a friendly message on the terminal of the server. 
    console.log("Chat server running at port 5000\n"); 
+0

TCP est remarquablement robuste dans la mesure où il attendra longtemps (heures, le plus souvent) avant de déclarer une connexion à mort. Vous devez implémenter une sorte de protocole de type ping/pong où le serveur essaie d'envoyer périodiquement un message au client pour voir si la connexion est toujours active. Il n'y a que ['socket.setKeepAlive'] (https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay), mais c'est à l'OS de déterminer après combien de temps une connexion est considérée comme morte (encore une fois, cela peut être des heures). – robertklep

+0

@robertklep même numéro J'ai utilisé 'socket.setKeepAlive (true, 60000); // 1 min = 60000 milliseconds.'' il détecte que le client est déconnecté mais émet exception'Exception s'est produite: Erreur Erreur: lire ECONNRESET à exports._errnoException (util.js: 1018: 11) à TCP.onread (net .js: 568: 26) 'aussi comment trouver qui a été déconnecté dans une connexion multi-client –

+0

@robertklep oui Je reçois aussi le même problème si j'utilise' socket.setKeepAlive' –

Répondre

0
// Load the TCP Library 
net = require('net'); 

// Keep track of the chat clients 
var clients = []; 

// Start a TCP Server 
net.createServer(function(socket) { 
try { 
    socket.setKeepAlive(true, 600); //1 min = 60000 milliseconds. 
} catch (exception) { 
    console.log('exception', exception); 
} 
socket.on('error', onError.bind({}, socket)); 

function onError(socket) { 

    //console.log('Socket error!', socket); 
    console.log('name', socket.name); 


} 
// Identify this client 
socket.name = socket.remoteAddress + ":" + socket.remotePort 

// Put this new client in the list 
clients.push(socket); 

// Send a nice welcome message and announce 
socket.write("Welcome " + socket.name + "\n"); 
broadcast(socket.name + " joined\n", socket); 

// Handle incoming messages from clients. 
socket.on('data', function(data) { 
    console.log(data); 
    broadcast(socket.name + "> " + data, socket); 
}); 

// Remove the client from the list when it leaves 
socket.on('end', function() { 
    clients.splice(clients.indexOf(socket), 1); 
    broadcast(socket.name + " left .\n"); 
}); 

// Send a message to all clients 
function broadcast(message, sender) { 
    clients.forEach(function(client) { 
     // Don't want to send it to sender 
     if (client === sender) return; 
     client.write(message); 
    }); 
    // Log it to the server output too 
    process.stdout.write(message) 
    } 

}).listen(8003); 

// Put a friendly message on the terminal of the server. 
console.log("Chat server running at port 8003\n");