如何通过 Unix Domain 套接字正确实现 Node.js 通信?

问题描述 投票:0回答:1

我正在调试多线程 Node.js 实例之间的 IPC 实现。 由于本身不支持数据报套接字,因此我使用默认的流协议,并进行简单的应用程序级打包。 当两个线程通信时,服务器端总是接收,客户端总是发送。

// writing to the client trasmitter
// const transmitter = net.createConnection(SOCKETFILE);

    const outgoing_buffer = [];
    let writeable = true;
    
    const write = (transfer) => {
        if (transfer) outgoing_buffer.push(transfer);
        if (outgoing_buffer.length === 0) return;
        if (!writeable) return;
        const current = outgoing_buffer.shift();
        writeable = false;
        transmitter.write(current, "utf8", () => {
            writeable = true;
            write();
        });
    };
// const server = net.createServer();
// server.listen(SOCKETFILE);
// server.on("connection", (reciever) => { ...
// reciever.on("data", (data) => { ...
// ... the read function is called with the data

 let incoming_buffer = "";
    const read = (data) => {
        incoming_buffer += data.toString();
        while (true) {
            const decoded = decode(incoming_buffer);
            if (!decoded) return;
            incoming_buffer = incoming_buffer.substring(decoded.length);
            // ... digest decoded string
        }
    };

我的流在传输包中进行编码,并解码回来,数据 JSON 来回字符串化。

现在发生的情况是,由于 CPU 负载较高时似乎更频繁,incoming_buffer 会时不时地获得一些随机字符,在记录时显示为 ��� 。

即使这种情况在 10000 次转账中只发生一次,这也是一个问题。我需要一种可靠的方法,即使 CPU 负载达到最大,流也应该没有意外的字符,并且不应该被损坏。

什么可能导致这种情况? 实施这个的正确方法是什么?

node.js stream unix-socket
1个回答
0
投票

好的,我找到了。 Node 文档给出了提示。

readable.setEncoding(encoding)

必须用来代替

incoming_buffer += data.toString();

Readable.setEncoding() 方法设置数据的字符编码 从可读流中读取。

默认不指定编码,返回流数据 作为 Buffer 对象。设置编码会导致流数据 作为指定编码的字符串而不是作为 Buffer 返回 对象。例如,调用 Readable.setEncoding('utf8') 将导致 输出数据被解释为 UTF-8 数据,并传递为 字符串。调用 Readable.setEncoding('hex') 会导致数据被 以十六进制字符串格式编码。

可读流将正确处理多字节字符 通过流传递,否则会变得不正确 如果只是从流中作为 Buffer 对象提取,则进行解码。

因此,它更依赖于压力测试中的多字节字符数,而不是 CPU 负载。

© www.soinside.com 2019 - 2024. All rights reserved.