我搜索了四周,並且找不到確切的問題,我想要回答,或者我需要有人像我一樣向我解釋它'm 5.Node.js網絡庫:從'data'事件獲取完整數據
基本上,我有一個使用Net庫的Node.js腳本。我連接到多個主機,併發送命令,並偵聽返回數據。
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 /分隔符時將第一部分追加到其餘部分,也會丟失中間的大塊。如何正確緩衝數據以確保從流中獲取完整的消息?
編輯:好的,這似乎是更好的工作:
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'),在那裏處理。
你是如何檢測到塊丟失的?從記錄到控制檯的調試消息?與手動進行並排比較,可以得到 –
。 –