javascript - 如何将套接字传递给 Node 中的集群

标签 javascript node.js sockets socket.io node-cluster

我想要一个多进程 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()),所以你不能只是序列化它并通过管道发送它。

也许你可以检查thisthis关于如何使用集群 WebSocket。

这看起来并不是很微不足道..也许你可以将CPU密集型任务传递给一些工作进程(通过集群或自己生成它们),将结果发送回主进程并让他与主进程进行所有通信客户?

关于javascript - 如何将套接字传递给 Node 中的集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35134189/

相关文章:

php - 在服务器 asp.net/php 上注入(inject) javascript 函数

android - Appcelerator Titanium 3 安卓模拟器环境错误

java - 如何测试多线程服务器

c - 第一个 DGRAM 没有 IP

javascript - 使用 System.import 在 Webpack 2 中整合 Bundle

javascript - 如何理解 "{ fun: function.bind(this) }"?

Javascript for 循环遍历 JSON 值

javascript - 两个用户如何协作编辑一个 JSON 文件?

javascript - 将 NodeJS 缓冲区转换为具有函数的 JavaScript 对象

java - 为什么 Android 套接字周期性读取如此缓慢?