示例:发送一个套接字对象
【Example: sending a socket object】
同样地,sendHandler 参数可以用于将一个套接字的句柄传递给子进程。下面的示例创建了两个子进程,它们分别以“普通”或“特殊”优先级处理连接:
【Similarly, the sendHandler argument can be used to pass the handle of a
socket to the child process. The example below spawns two children that each
handle connections with "normal" or "special" priority:】
const { fork } = require('node:child_process');
const { createServer } = require('node:net');
const normal = fork('subprocess.js', ['normal']);
const special = fork('subprocess.js', ['special']);
// Open up the server and send sockets to child. Use pauseOnConnect to prevent
// the sockets from being read before they are sent to the child process.
const server = createServer({ pauseOnConnect: true });
server.on('connection', (socket) => {
// If this is special priority...
if (socket.remoteAddress === '74.125.127.100') {
special.send('socket', socket);
return;
}
// This is normal priority.
normal.send('socket', socket);
});
server.listen(1337);import { fork } from 'node:child_process';
import { createServer } from 'node:net';
const normal = fork('subprocess.js', ['normal']);
const special = fork('subprocess.js', ['special']);
// Open up the server and send sockets to child. Use pauseOnConnect to prevent
// the sockets from being read before they are sent to the child process.
const server = createServer({ pauseOnConnect: true });
server.on('connection', (socket) => {
// If this is special priority...
if (socket.remoteAddress === '74.125.127.100') {
special.send('socket', socket);
return;
}
// This is normal priority.
normal.send('socket', socket);
});
server.listen(1337);subprocess.js 将作为传递给事件回调函数的第二个参数接收套接字句柄:
【The subprocess.js would receive the socket handle as the second argument
passed to the event callback function:】
process.on('message', (m, socket) => {
if (m === 'socket') {
if (socket) {
// Check that the client socket exists.
// It is possible for the socket to be closed between the time it is
// sent and the time it is received in the child process.
socket.end(`Request handled with ${process.argv[2]} priority`);
}
}
}); 不要在已传递给子进程的套接字上使用 .maxConnections。父进程无法追踪套接字何时被销毁。
【Do not use .maxConnections on a socket that has been passed to a subprocess.
The parent cannot track when the socket is destroyed.】
子进程中的任何 'message' 处理程序都应该检查 socket 是否存在,因为在将连接发送给子进程的过程中,连接可能已经关闭。
【Any 'message' handlers in the subprocess should verify that socket exists,
as the connection may have been closed during the time it takes to send the
connection to the child.】