非常简单的 node.js 问题。我想扩展流对象以重新分块来自远程连接的数据。我正在执行多个 telnet 并向其他服务器发送命令,它们会发回响应。它看起来像这样。
> Hello, this is a command
This is the response to the command.
Sometimes it pauses here (which triggers the 'data' event prematurely).
But the message isn't over until you see the semicolon
;
我想做的不是在暂停时触发“数据”事件,而是等待 ; 并触发自定义“消息”事件。
我已经阅读并重读了这个问题,但我还没有完全理解(部分是因为它是关于可写流,部分是因为我还没有了解 CoffeeScript)。
编辑:我想我在这里问两件事:
- 如何扩展/继承 net.CreateConnection 使用的流对象?
- 我可以扩展prototype.write 来“拆分”并重新“发出”每个部分吗?
这是我到目前为止所做的一个片段,但是分块应该是流的一部分,而不是“数据”侦听器的一部分:
var net = require('net');
var nodes = [
//list of ip addresses
];
function connectToServer(ip) {
var conn = net.createConnection(3083, ip);
conn.on('connect', function() {
conn.write ("login command;");
});
conn.on('data', function(data) {
var read = data.toString();
var message_list = read.split(/^;/m);
message_list.forEach (function(message) {
console.log("Atonomous message from " + ip + ':' + message);
//I need to extend the stream object to emit these instead of handling it here
//Also, sometimes the data chunking breaks the messages in two,
//but it should really wait for a line beginning with a ; before it emits.
});
});
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) {
connectToServer(node);
});
如果我使用的是原始流,我想它会是这样的(基于我在其他地方找到的代码)?
var messageChunk = function () {
this.readable = true;
this.writable = true;
};
require("util").inherits(messageChunk, require("stream"));
messageChunk.prototype._transform = function (data) {
var regex = /^;/m;
var cold_storage = '';
if (regex.test(data))
{
var message_list = read.split(/^;/m);
message_list.forEach (function(message) {
this.emit("data", message);
});
}
else
{
//somehow store the data until data with a /^;/ comes in.
}
}
messageChunk.prototype.write = function () {
this._transform.apply(this, arguments);
};
但我没有使用原始流,我使用的是 net.createConnection 对象返回的流对象。