javascript - nodejs关于进程间发送句柄的一点疑问
我想大声告诉你
我想大声告诉你 2017-05-16 13:45:26
0
1
626

先看一个一个应用程序,通过net服务触发 http服务;

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);
})

简单来说就是 初始化两个服务 一个net服务 一个http服务,用net服务监听端口,客户端连接后,触发http服务的连接事件,并将socket传给http服务;
里面有一行注释,如果关闭注释,服务就关闭了;
但是再看另一个应用,这里涉及到了子进程模块,还有进程间的句柄传递;看程序;

父进程文件:

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();
})

子进程文件:

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);
    })
})

大家看父进程文件里也有一行注释,但是这里的注释去掉后,服务能正常工作,这是什么原因呢?
父进程的net服务已经关闭了,已经不监听3000端口了,想不明不白
在代码层面理解 父进程结束了,但是子进程没有结束,但是请求的流是怎么运行的呢,或者说这个代码是怎么运行的,思绪有点乱啊,node深入浅出,读起来还真是有点费劲啊

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

全部回复(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上的问题可以看这里

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板