マルチプロセスノードを取得したいと思います。ワーカーはクライアント接続をリッスンしています。マスタープロセスはクライアントにメッセージを送信するため、ソケットをマスタープロセスに渡す必要があります。ワーカーは、クライアントにメッセージを送信するためにソケットも必要です。
ソケットは循環オブジェクトであり、マスター プロセスに渡すことはできません。
私のコード:
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