javascript – Nodejs hat einige Fragen zum Senden von Handles zwischen Prozessen
我想大声告诉你
我想大声告诉你 2017-05-16 13:45:26
0
1
611

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

我想大声告诉你
我想大声告诉你

Antworte allen(1)
阿神

google了一下,在stackoverflow上找到一个类似的问题

关键应该在这一段上handleConversion
在send时有handle参数的情况下,会调用handleConversion[type]
可以看到在type:"net.Server"时,send的是server._handle
而接收时是这样的

got: function(message, handle, emit) {
      var self = this;

      var server = new net.Server();
      server.listen(handle, function() {
        emit(server);
      });
}

也就是说父进程send了server._handle
而子进程则使用这个handle重建了一个server
所以实际上子进程中的server已经跟父进程中的不是同一个了,父进程的server.close自然不会对子进程产生影响

stackoverflow上的问题可以看这里

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage