简单的多路复用 node.js 流 - 块连接问题

问题描述

我正在尝试实现一个简单的 node.js 流复用器/解复用器。

目前在实现多路复用机制时,我注意到多路复用器的输出被连接成一个单一的块。

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 事件并从回调中读取:

每当流将数据块的所有权放弃给消费者时,就会发出 'data' 事件。

mux.on("data",d => {
    console.log("mux >",d)
});

现在产生:

mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>

还解释了为什么 readable 只发出一次 in the docs

一旦到达流数据的末尾但在发出 'end' 事件之前,也将发出 'readable' 事件。

datareadable 的行为不同。在您的情况下, readable 永远不会发出,直到到达流数据的末尾,它会立即返回所有数据。 data 在每个可用块上发出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...