我了解您想要向集群中的所有节点工作进程广播信息,虽然您不能直接发送socket组件,但是有一些解决方案可以达到目的。我会通过以下示例尝试解释:
步骤1:当客户端操作需要广播时:
Child.js (Process that has been forked) :
socket.on("BROADCAST_TO_ALL_WORKERS", function (data)
{
process.send({cmd : 'BROADCAST_TO_ALL_WORKERS', message :data.message});
})
步骤 2:在集群创建侧
Server.js (Place where cluster forking happens):
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
worker.on('message', function (data) {
if (data.cmd === "BROADCAST_TO_ALL_WORKERS") {
console.log(server_debug_prefix() + "Server Broadcast To All, Message : " + data.message + " , Reload : " + data.reload + " Player Id : " + data.player_id);
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send({cmd : "BROADCAST_TO_WORKER", message : data.message});
});
}
});
}
cluster.on('exit', function (worker, code, signal) {
var newWorker = cluster.fork();
newWorker.on('message', function (data) {
console.log(data);
if (data.cmd === "BROADCAST_TO_ALL_WORKERS") {
console.log(data.cmd,data);
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send({cmd : "BROADCAST_TO_WORKER", message : data.message});
});
}
});
});
}
else {
require("./Child.js");
}
第三步:在子进程中进行广播 -
-> 在Child.js中的io.on("connection")之前加入此代码。
process.on("message", function(data){
if(data.cmd === "BROADCAST_TO_WORKER"){
io.sockets.emit("SERVER_MESSAGE", { message: data.message, reload: data.reload, player_id : data.player_id });
}
});
我希望这可以帮到您。如果需要更多解释,请告诉我。
for
循环内的var
?worker
将会保存最后一个被fork的worker,而不是每个worker(特别是在事件回调函数内)。如果你不关心全部,你可以仅仅封闭你的回调函数;或者你可以将所有的workers存放在数组中。 - dresendechild_process
,我认为它会打开一个套接字来处理进程间通信。您应该使用真实数据进行几次测试,并查看它们的表现如何。 - alessioalex