Nodejs 如何把 cleartextStream 传递到 child_process 中啊?

Nodejs 如何把 cleartextStream 传递到 child_process 中啊?

有谁用过 tls 啊? 问题和这哥们一样 http://stackoverflow.com/questions/12971738/pass-tls-cleartextstream-instance-to-worker-process 但怎么具体实现啊。 我新建一个socket 然后 pipe 还是报错。

handle.onread = function() {};
                ^ TypeError: Cannot set property 'onread' of null
at ChildProcess.handleConversion.net.Socket.send (child_process.js:134:21)
at ChildProcess.target.send (child_process.js:436:52)
at Server.<anonymous> (/Users/zcx/BestApp/android-mqtt-push-server/server_master_zmq.js:171:12)
at Server.EventEmitter.emit (events.js:98:17)
at SecurePair.<anonymous> (tls.js:1117:16)
at SecurePair.g (events.js:175:14)
at SecurePair.EventEmitter.emit (events.js:92:17)
at SecurePair.maybeInitFinished (tls.js:896:10)
at CleartextStream.read [as _read] (tls.js:430:15)
at CleartextStream.Readable.read (_stream_readable.js:294:10)

2 回复

要将 cleartextStream 从一个进程传递到另一个进程(例如通过 child_process 模块创建的子进程),你需要确保在父进程中正确地读取并处理来自 cleartextStream 的数据,并将其发送给子进程。由于 Node.js 中的进程间通信(IPC)是基于消息的,因此不能直接传递流对象,而是需要将数据转换为可以序列化的格式。

以下是一个简单的示例,演示如何将 cleartextStream 的数据通过 IPC 通道传递给子进程:

父进程代码

const { fork } = require('child_process');
const tls = require('tls');

// 创建一个 TLS 服务器
const server = tls.createServer({
    cert: fs.readFileSync('path/to/cert.pem'),
    key: fs.readFileSync('path/to/key.pem')
}, (cleartextStream) => {
    console.log('新连接已建立');

    // 监听 cleartextStream 上的数据事件
    cleartextStream.on('data', (data) => {
        // 发送数据到子进程
        process.send(data);
    });

    // 监听 cleartextStream 的结束事件
    cleartextStream.on('end', () => {
        console.log('连接已关闭');
    });
});

server.listen(9999, () => {
    console.log('TLS 服务器正在监听端口 9999');
});

// 创建子进程
const child = fork('./child.js');

// 监听子进程的消息
process.on('message', (msg) => {
    console.log('收到子进程消息:', msg);
});

子进程代码 (child.js)

process.on('message', (data) => {
    console.log('父进程发来的数据:', data.toString());
});

解释

  1. 创建 TLS 服务器:首先,我们创建一个 TLS 服务器来接受安全连接。
  2. 处理 cleartextStream:当新的安全连接被接受时,我们监听 cleartextStream 上的 data 事件,以捕获传入的数据。
  3. 发送数据给子进程:捕获到的数据通过 process.send() 方法发送给子进程。
  4. 接收子进程消息:在父进程中,我们监听 message 事件以接收子进程发送的消息。
  5. 子进程处理数据:子进程接收到数据后,在 message 事件中进行处理。

这种方法确保了数据能够从 cleartextStream 流式传输到子进程,而不需要直接传递流对象。


要将 cleartextStream 传递给 child_process,你可以使用 Node.js 的 process 模块中的 send 方法。但是直接传递流对象(如 cleartextStream)通常是不可行的,因为流对象在不同的进程中不能直接共享。一种常见的做法是通过进程间通信(IPC)将流的数据传递到子进程中。

以下是一个简单的示例,展示如何创建一个 cleartextStream 并将其数据传递给子进程:

父进程代码

const { fork } = require('child_process');
const net = require('net');
const tls = require('tls');

// 创建一个 TLS 服务器
const server = tls.createServer({
    key: 'your-key',
    cert: 'your-cert'
}, (socket) => {
    const cleartextStream = socket;

    // 创建子进程
    const child = fork('child.js');

    // 将 cleartextStream 的数据发送到子进程
    cleartextStream.on('data', (data) => {
        child.send('data', data);
    });

    // 监听子进程的消息
    child.on('message', (msg) => {
        console.log(`Received from child process: ${msg}`);
    });
});

server.listen(8443, () => {
    console.log('TLS server listening on port 8443');
});

子进程代码 (child.js)

process.on('message', (data) => {
    console.log(`Received data: ${data.toString()}`);
});

解释

  1. 父进程:创建一个 TLS 服务器并监听指定端口。当客户端连接时,创建一个子进程,并将 cleartextStream 上的数据通过 process.send 发送到子进程中。
  2. 子进程:监听来自父进程的消息,打印接收到的数据。

这种方法利用了 Node.js 的进程间通信功能,而不是直接传递流对象,以确保数据可以在不同进程中正确处理。

回到顶部