Ich habe gesucht, und entweder kann nicht die genaue Frage, die ich versuche zu beantworten, oder ich brauche jemanden, um es mir wie ich zu erklären bin 5.Node.js net library: vollständige Daten von "Daten" Ereignis
Grundsätzlich habe ich ein Node.js Skript mit der Net-Bibliothek. Ich verbinde mich mit mehreren Hosts und sende Befehle und lausche auf Rückgabedaten.
var net = require('net');
var nodes = [
'HOST1,192.168.179.8',
'HOST2,192.168.179.9',
'HOST3,192.168.179.10',
'HOST4,192.168.179.11'
];
function connectToServer(tid, ip) {
var conn = net.createConnection(23, ip);
conn.on('connect', function() {
conn.write (login_string); // login string hidden in pretend variable
});
conn.on('data', function(data) {
var read = data.toString();
if (read.match(/Login Successful/)) {
console.log ("Connected to " + ip);
conn.write(command_string);
}
else if (read.match(/Command OK/)) { // command_string returned successful,
// read until /\r\nEND\r\n/
// First part of data comes in here
console.log("Got a response from " + ip + ':' + read);
}
else {
//rest of data comes in here
console.log("Atonomous message from " + ip + ':' + read);
}
});
conn.on('end', function() {
console.log("Lost conncection to " + ip + "!!");
});
conn.on('error', function(err) {
console.log("Connection error: " + err + " for ip " + ip);
});
}
nodes.forEach(function(node) {
var nodeinfo = node.split(",");
connectToServer(nodeinfo[0], nodeinfo[1]);
});
Die Daten werden in zwei Teile aufgeteilt. Selbst wenn ich die Daten in einem Hash speichern und den ersten Teil an den Rest anfüge, wenn ich das/\ r \ nEND \ r \ n/Trennzeichen lese, fehlt ein Chunk aus der Mitte. Wie puffere ich die Daten richtig, um sicherzustellen, dass ich die vollständige Nachricht aus dem Stream bekomme?
EDIT: Ok, scheint dies besser zu funktionieren:
function connectToServer(tid, ip) {
var conn = net.createConnection(23, ip);
var completeData = '';
conn.on('connect', function() {
conn.write (login_string);
});
conn.on('data', function(data) {
var read = data.toString();
if (read.match(/Login Successful/)) {
console.log ("Connected to " + ip);
conn.write(command_string);
}
else {
completeData += read;
}
if (completeData.match(/Command OK/)) {
if (completeData.match(/\r\nEND\r\n/)) {
console.log("Response: " + completeData);
}
}
});
conn.on('end', function() {
console.log("Connection closed to " + ip);
});
conn.on('error', function(err) {
console.log("Connection error: " + err + " for ip " + ip);
});
}
Mein größtes Problem offenbar Fehler eine Logik war. Ich wartete entweder auf das Stück, das die Antwort begann, oder auf das Stück, das es beendete. Ich habe nicht alles zwischengespeichert.
Ich denke, wenn ich alle Node-ish darüber bekommen wollte, sollte ich ein Ereignis auslösen, wann immer eine vollständige Nachricht kam (beginnend mit einer leeren Zeile, endend mit 'END' auf einer Zeile) und tun die Verarbeitung dort.
Wie erkennen Sie, dass ein Chunk fehlt? Aus den Debug-Meldungen in der Konsole protokolliert? –
Seite-an-Seite-Vergleich mit der manuellen Ausführung. –