Tôi đã tìm kiếm xung quanh và không tìm được câu hỏi chính xác mà tôi đang cố trả lời hoặc tôi cần ai đó giải thích cho tôi như tôi 'm 5.Thư viện mạng Node.js: nhận dữ liệu hoàn chỉnh từ sự kiện 'dữ liệu'
Về cơ bản, tôi có tập lệnh Node.js bằng cách sử dụng thư viện Net. Tôi đang kết nối với nhiều máy chủ và gửi lệnh cũng như nghe dữ liệu trả về.
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]);
});
Dữ liệu kết thúc được chia thành hai phần. Ngay cả khi tôi lưu trữ dữ liệu trong một băm và chắp thêm phần đầu tiên vào phần còn lại khi tôi đọc/\ r \ nEND \ r \ n/dấu phân cách, có một đoạn bị mất ở giữa. Làm cách nào để đệm đúng dữ liệu để đảm bảo tôi nhận được thông báo đầy đủ từ luồng?
EDIT: Ok, điều này dường như được làm việc tốt hơ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);
});
}
vấn đề lớn nhất của tôi có lẽ là một lỗi logic. Tôi đã hoặc đang đợi đoạn tin bắt đầu trả lời, hoặc đoạn tin đã kết thúc nó. Tôi đã không cứu mọi thứ ở giữa.
Tôi đoán nếu tôi muốn nhận được tất cả Node-ish về nó, tôi nên kích hoạt một sự kiện bất cứ khi nào một thông điệp đầy đủ đến (bắt đầu bằng một dòng trống, kết thúc bằng 'END' trên một dòng của chính nó), và làm việc xử lý ở đó.
Làm cách nào bạn phát hiện thấy một đoạn bị thiếu? Từ các thông báo gỡ lỗi đăng nhập vào giao diện điều khiển? –
so sánh song song với thực hiện thủ công. –