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)
要将 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());
});
解释
- 创建 TLS 服务器:首先,我们创建一个 TLS 服务器来接受安全连接。
- 处理
cleartextStream
:当新的安全连接被接受时,我们监听cleartextStream
上的data
事件,以捕获传入的数据。 - 发送数据给子进程:捕获到的数据通过
process.send()
方法发送给子进程。 - 接收子进程消息:在父进程中,我们监听
message
事件以接收子进程发送的消息。 - 子进程处理数据:子进程接收到数据后,在
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()}`);
});
解释
- 父进程:创建一个 TLS 服务器并监听指定端口。当客户端连接时,创建一个子进程,并将
cleartextStream
上的数据通过process.send
发送到子进程中。 - 子进程:监听来自父进程的消息,打印接收到的数据。
这种方法利用了 Node.js 的进程间通信功能,而不是直接传递流对象,以确保数据可以在不同进程中正确处理。