Nodejs利用net和cluster模块主进程将socket对象传递给子进程中运行返回消息

主进程代码app.js

const cluster=require('cluster');
const net =require('net');
//判断是否在主进程中
if(cluster.isPrimary)
{
    //子进程中运行模块文件,exec的文件路径
    cluster.setupPrimary({
        exec:'child940.js'
    });
    //创建子进程,必须写在server的外面,如果写在server里面,子进程接收不到内容;
    //因为worker.send是一个异步操作,很可能客户端已经发送了信息,而子进程却后一步建立而没有收到信息
    const worker=cluster.fork();
    
//创建net服务器
    const server =net.createServer();
    server.on('connection',function(socket){
        console.log(socket.remoteAddress);
        //连接后创建socket对象
        if(socket.remoteAddress!=='localhost')
        {
        	//将socket对象发送给子进程
            worker.send('socket',socket);
            return;
        }
        //如果不是localhost,即主进程处理
        socket.end('客户端请求被主进程处理');
       
    })
    server.listen(42367,'localhost');
    server.on('listening',function(){
        console.log('net服务器端口监听已开启');
    });

}

//子进程处理代码 child.js

//子进程接受信息,worker.send()发过来的
process.on('message',function(m,socket){
    if(m==='socket')
    {
        
        //socket对象接受到的信息
        socket.on('data',function(data){
            console.log('收到客户端发来的信息',data.toString());
            //接受的字节数
            console.log(socket.bytesRead);
            const response=data.toString();
            //将客户端发送过来的数据,再返回给客户端
            socket.write(response);
        });
        
    }
   
})

//客户端 client.js

const net =require('net');
const client=new net.Socket();
client.connect(42367,'localhost',function(){
    console.log('已经连接到服务器端');
    client.write('你好');
});
client.on('data',function(data){
    console.log('接收到服务端数据:'+data.toString());
    client.end();
});
client.on('close',function(){
    console.log('客户端关闭连接');
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值