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");
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
@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 –
@robertklep oui Je reçois aussi le même problème si j'utilise' socket.setKeepAlive' –