2

マルチプロセスノードを取得したいと思います。ワーカーはクライアント接続をリッスンしています。マスタープロセスはクライアントにメッセージを送信するため、ソケットをマスタープロセスに渡す必要があります。ワーカーは、クライアントにメッセージを送信するためにソケットも必要です。

ソケットは循環オブジェクトであり、マスター プロセスに渡すことはできません。

私のコード:

const cluster = require('cluster');

const http = require('http');
var io = require('socket.io');

var users;
var clients = {};
if (cluster.isMaster) {

function messageHandler(msg) {
   if (msg.usersarray) {
      usersarray = msg.usersarray;
      console.log(usersarray);
   }else if(msg.socket){
      clients[usersarray["manu"][0]] = msg.socket;
      clients[usersarray["manu"][0]].emit("hola","hola");               
   }
}

// Start workers and listen for messages containing notifyRequest
const numCPUs = require('os').cpus().length;
for (var i = 0; i < numCPUs; i++) {
  cluster.fork();
}

Object.keys(cluster.workers).forEach((id) => {
  cluster.workers[id].on('message', messageHandler);
});


}else {

// Create server & socket

var server = http.createServer(function(req, res){
    // Send HTML headers and message
    res.writeHead(404, {'Content-Type': 'text/html'});
    res.end('<h1>Aw, snap! 404</h1>');
});
server.listen(3000);
io = io.listen(server);

// Add a connect listener
io.sockets.on('connection', function(socket) {
    var hs = socket.handshake;
    console.log("socket connected");    
    if(users == undefined){
        users = {};
    }

    if(hs.query.usuario != undefined){

        if(users[hs.query.usuario] == undefined){
            users[hs.query.usuario] = new Array();
        }    

        users[hs.query.usuario].push(socket.id); // connected user with its socket.id
        clients[socket.id] = socket; // add the client data to the hash
        process.send({ usersarray: users});
        process.send({ socket: socket});
    }

    // Disconnect listener
    socket.on('disconnect', function() {
        console.log('Client disconnected.');
    });
});
}

インライン process.send({ socket: socket}); Node js で「TypeError: 循環構造を JSON に変換しています」というエラーが表示される

-円形オブジェクトを変換するモジュールを使用しましたが、機能しません。

- ソケット ID を渡そうとしましたが、マスター プロセスでこの ID を使用して新しいソケットを作成しましたが、使用方法がわかりませんでした。

ワーカーからマスター プロセスにソケットを渡す可能性はありますか?

ノード js バージョン: v5.5.0

4

2 に答える 2