Schauen Sie sich zunächst jede Anwendung an und lösen Sie den HTTP-Dienst über den Netzdienst aus
const http = require('http');
const net = require('net');
let netServer = net.createServer();
let httpServer = http.createServer((req, res)=>{
res.end('ok');
})
netServer.listen(3000,function(){
console.log("222222");
//netServer.close();
})
netServer.on('connection',(socket)=>{
httpServer.emit('connection',socket);
})
Um es einfach auszudrücken: Es werden zwei Dienste initialisiert, ein Netzdienst und ein http-Dienst. Nachdem der Client eine Verbindung hergestellt hat, wird das Verbindungsereignis des http-Dienstes ausgelöst und der Socket an den http übergeben Dienst;
Es gibt eine Zeile mit Kommentaren. Beachten Sie, dass der Dienst geschlossen ist. Schauen Sie sich jedoch das Unterprozessmodul an und behandeln Sie das Programm
Übergeordnete Prozessdatei:
var cp = require('child_process');
var net = require('net');
var child1 = cp.fork('./c.js');
var child2 = cp.fork('./c.js');
var netServer = net.createServer();
netServer.listen(3000,function(){
child1.send('server', netServer);
child2.send('server', netServer);
console.log("222222");
netServer.close();
})
Unterprozessdatei:
const http = require('http');
let httpServer = http.createServer((req, res)=>{
// res.writeHead(200,{'Content-Type':'text/plain' + '\n'});
res.end('ok');
})
process.on('message', function(m, tcp){
console.log(m);
tcp.on('connection', function(socket){
httpServer.emit('connection',socket);
})
})
Wie Sie sehen, gibt es auch eine Zeile mit Kommentaren in der übergeordneten Prozessdatei, aber nachdem die Kommentare hier entfernt wurden, kann der Dienst normal funktionieren. Was ist der Grund?
Der Netzdienst des übergeordneten Prozesses wurde geschlossen und überwacht Port 3000 nicht mehr. Ich verstehe nicht.Auf Codeebene verstehe ich, dass der übergeordnete Prozess beendet wurde, der untergeordnete Prozess jedoch nicht. Aber wie läuft der Anfragestrom ab, bzw. wie läuft der Code ab? Meine Gedanken sind etwas verwirrend. Es ist wirklich schwer zu lesen
google了一下,在stackoverflow上找到一个类似的问题
关键应该在这一段上handleConversion
在send时有handle参数的情况下,会调用handleConversion[type]
可以看到在type:"net.Server"时,send的是server._handle
而接收时是这样的
也就是说父进程send了server._handle
而子进程则使用这个handle重建了一个server
所以实际上子进程中的server已经跟父进程中的不是同一个了,父进程的server.close自然不会对子进程产生影响
stackoverflow上的问题可以看这里