Я искал вокруг, и либо не могу найти точный вопрос, на который я пытаюсь ответить, либо мне нужен кто-то, чтобы объяснить это мне, как я 'm 5.Node.js net library: получение полных данных из события «данные»
В принципе, у меня есть сценарий Node.js с использованием библиотеки Net. Я подключаюсь к нескольким хостам и посылаю команды, а также прослушиваю возвращаемые данные.
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]);
});
Данные заканчиваются разбиением на два куска. Даже если я храню данные в хеше и добавляю первую часть к остатку, когда я читаю/\ r \ nEND \ r \ n/разделитель, есть кусок, отсутствующий посередине. Как правильно буферизовать данные, чтобы получить полное сообщение из потока?
EDIT: Хорошо, это, кажется, работает лучше:
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);
});
}
Моя самая большая проблема, по-видимому логическая ошибка. Я либо ждал, когда кусок начал ответ, или кусок, который его закончил. Я не спасал все между ними.
Я предполагаю, что если бы я хотел получить все Node-ish, я должен запустить событие всякий раз, когда приходит полное сообщение (начиная с пустой строки, заканчивая «END» на отдельной строке), и делайте обработка там.
Как вы обнаруживаете, что кусок отсутствует? От сообщений отладки, зарегистрированных на консоли? –
бок о бок сравнение с выполнением этого вручную. –