类似地,sendHandle 参数可用于将 socket 的句柄传给子进程。 以下示例衍生了两个子进程,分别用于处理 “normal” 连接或优先处理 “special” 连接:

    1. const { fork } = require('child_process');
    2. const normal = fork('subprocess.js', ['normal']);
    3. const special = fork('subprocess.js', ['special']);
    4. // 开启 server,并发送 socket 给子进程。
    5. // 使用 `pauseOnConnect` 防止 socket 在被发送到子进程之前被读取。
    6. const server = require('net').createServer({ pauseOnConnect: true });
    7. server.on('connection', (socket) => {
    8. // 特殊优先级。
    9. if (socket.remoteAddress === '74.125.127.100') {
    10. special.send('socket', socket);
    11. return;
    12. }
    13. // 普通优先级。
    14. normal.send('socket', socket);
    15. });
    16. server.listen(1337);

    subprocess.js 会接收该 socket 句柄作为传给事件回调函数的第二个参数:

    1. process.on('message', (m, socket) => {
    2. if (m === 'socket') {
    3. if (socket) {
    4. // 检查客户端 socket 是否存在。
    5. // socket 在被发送与被子进程接收这段时间内可被关闭。
    6. socket.end(`请求使用 ${process.argv[2]} 优先级处理`);
    7. }
    8. }
    9. });

    不要使用已被传给子进程的 socket 上的 .maxConnections。 父进程无法追踪 socket 何时被销毁。

    子进程中的任何 'message' 句柄都应该验证 socket 是否存在,因为连接可能会在它发送给子进程的这段时间内被关闭。