我想要一个多进程 Node 。工作人员正在监听客户的连接。我需要将套接字传递给主进程,因为主进程向客户端发送消息。 Workers 还需要套接字来向客户端发送消息。
Socket 是一个循环对象,无法传递给主进程。
我的代码:
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 创建新套接字,但我不知道如何使用它。
是否有可能将套接字从工作进程传递到主进程?
Node.js版本:v5.5.0
最佳答案
嗯,我认为你想做的事情是不可能的。当您创建集群时,这意味着您创建了单独的进程(主进程 + 工作进程),它们只能通过管道进行通信。
通过管道交谈意味着它们只能互相发送字符串。 process.send
尝试使用 JSON.stringify 将 Javascript 对象序列化为 JSON(--> 从中生成字符串) 。例如 JSON 不能有函数、圆圈等。我刚刚检查了 socket
对象,它非常复杂并且包含函数(例如 socket.emit()
),所以你不能只是序列化它并通过管道发送它。
也许你可以检查this或this关于如何使用集群 WebSocket。
这看起来并不是很微不足道..也许你可以将CPU密集型任务传递给一些工作进程(通过集群或自己生成它们),将结果发送回主进程并让他与主进程进行所有通信客户?
关于javascript - 如何将套接字传递给 Node 中的集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35134189/