简单多路复用 node.js 流 - 块连接问题
Simple multiplexing node.js stream - chunk concatenated issue
我正在尝试实现一个简单的 node.js 流 multiplexer/demultiplexer。
目前,在实现多路复用机制时,我注意到多路复用器的输出被连接成一个块。
const { PassThrough, Transform } = require("stream");
class Mux extends PassThrough {
constructor(options) {
super(options);
}
input(id, options) {
let encode = new Transform({
transform(chunk, encoding, cb) {
let buf = Buffer.alloc(chunk.length + 1);
buf.writeUInt8(id, 0);
chunk.copy(buf, 1);
cb(null, buf);
},
...options
});
encode.pipe(this);
return encode;
};
};
const mux = new Mux();
mux.on("readable", () => {
console.log("mux >", mux.read())
});
const in1 = mux.input(1);
const in2 = mux.input(2);
in1.write(Buffer.alloc(3).fill(255));
in2.write(Buffer.alloc(3).fill(127));
输出如下所示:mux > <Buffer 01 ff ff ff 02 7f 7f 7f>
。
我本以为我会收到两个 console.log
输出。
预期输出:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
有人可以解释为什么我只从两个输入中得到一个“可读”事件和一个串联的块吗?
使用 data
事件并从回调中读取:
The 'data' event is emitted whenever the stream is relinquishing ownership of a chunk of data to a consumer.
mux.on("data", d => {
console.log("mux >", d)
});
这现在产生:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
为什么 readable
只发出一次也解释了 in the docs:
The 'readable' event will also be emitted once the end of the stream data has been reached but before the 'end' event is emitted.
data
和 readable
表现不同。在您的情况下, readable
永远不会发出,直到到达流数据的末尾,一次 returns 所有数据。 data
在每个可用块上发出。
我正在尝试实现一个简单的 node.js 流 multiplexer/demultiplexer。
目前,在实现多路复用机制时,我注意到多路复用器的输出被连接成一个块。
const { PassThrough, Transform } = require("stream");
class Mux extends PassThrough {
constructor(options) {
super(options);
}
input(id, options) {
let encode = new Transform({
transform(chunk, encoding, cb) {
let buf = Buffer.alloc(chunk.length + 1);
buf.writeUInt8(id, 0);
chunk.copy(buf, 1);
cb(null, buf);
},
...options
});
encode.pipe(this);
return encode;
};
};
const mux = new Mux();
mux.on("readable", () => {
console.log("mux >", mux.read())
});
const in1 = mux.input(1);
const in2 = mux.input(2);
in1.write(Buffer.alloc(3).fill(255));
in2.write(Buffer.alloc(3).fill(127));
输出如下所示:mux > <Buffer 01 ff ff ff 02 7f 7f 7f>
。
我本以为我会收到两个 console.log
输出。
预期输出:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
有人可以解释为什么我只从两个输入中得到一个“可读”事件和一个串联的块吗?
使用 data
事件并从回调中读取:
The 'data' event is emitted whenever the stream is relinquishing ownership of a chunk of data to a consumer.
mux.on("data", d => {
console.log("mux >", d)
});
这现在产生:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
为什么 readable
只发出一次也解释了 in the docs:
The 'readable' event will also be emitted once the end of the stream data has been reached but before the 'end' event is emitted.
data
和 readable
表现不同。在您的情况下, readable
永远不会发出,直到到达流数据的末尾,一次 returns 所有数据。 data
在每个可用块上发出。