使用Node.js、Websocket-Socket.IO和Redis进行简单聊天的多个实例

使用Node.js、Websocket-Socket.IO和Redis进行简单聊天的多个实例,node.js,websocket,redis,socket.io,chat,Node.js,Websocket,Redis,Socket.io,Chat,我正在尝试使用Socket.IO创建一个带有Node.JS和Websocket的简单聊天应用程序。我从中得到启发,对于单个后端实例,它工作得很好 我想在后端有两个服务器实例,它们应该互相同步聊天信息,并将聊天历史记录存储在redis中。加入新聊天室后,客户端应显示当前频道的最后10条消息 我试图应用这个解决方案,但遇到了一些问题。首先我得到 到“ws://localhost:8080/socket.io/?EIO=3&transport=WebSocket&sid=leqgvy0cvk9yasz

我正在尝试使用Socket.IO创建一个带有Node.JS和Websocket的简单聊天应用程序。我从中得到启发,对于单个后端实例,它工作得很好

我想在后端有两个服务器实例,它们应该互相同步聊天信息,并将聊天历史记录存储在redis中。加入新聊天室后,客户端应显示当前频道的最后10条消息

我试图应用这个解决方案,但遇到了一些问题。首先我得到

到“ws://localhost:8080/socket.io/?EIO=3&transport=WebSocket&sid=leqgvy0cvk9yaszbaaa”的WebSocket连接失败:在收到握手响应之前连接已关闭

控制台中的错误。其次,两个客户端都在1秒的间隔内接收“有效负载”消息。我可能不理解redis同步机制是如何工作的,我也不知道如何显示聊天记录

以下是我目前的代码:

var conf = require('./config.json');
var cluster = require('cluster');
var os = require('os');

if (cluster.isMaster) {
  // we create a HTTP server, but we do not use listen
  // that way, we have a socket.io server that doesn't accept     connections
  var server = require('http').createServer();
  var io = require('socket.io').listen(server);
  var redis = require('socket.io-redis');

    io.adapter(redis({ host: conf.redisUri, port: conf.redisPort }));

  setInterval(function() {
    // all workers will receive this in Redis, and emit
    io.emit('chat', {time: new Date(), text:'payload'});
  }, conf.syncIntervall);

// set number of workers
  for (var i = 0; i < conf.numberOfWorkers; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
}

if (cluster.isWorker) {
  var express = require('express');
  var app = express();

  var http = require('http');
  var server = http.createServer(app);
  var io = require('socket.io').listen(server);
  var redis = require('socket.io-redis');

    // Webserver
    //app.listen(conf.defaultPort);
    server.listen(conf.defaultPort);

    // deliver static files
    app.use(express.static(__dirname + '/public'));
    // route for the / path
    app.get('/', function (req, res) {
        // send the index.html in the reponse
        res.sendfile(__dirname + '/public/index.html');
    });

    // Websocket

    io.adapter(redis({ host: conf.redisUri, port: conf.redisPort }));
    // Callback when a client connects
    io.sockets.on('connection', function (socket) {
    // store the room name in the socket session for this client
    socket.room = 'defaultChannel';
    // send client to room 1
    socket.join('defaultChannel');
    // echo to client they've connected
    socket.emit('chat', { time: new Date(), text: 'You have connected to room defaultChannel on the server!' });
    socket.emit('chat', { time: new Date(), text: 'Connected to chat worker-node: ' + cluster.worker.id});
    // if a message is received
    socket.on('chat', function (data) {
        // the it will be send to all other clients
        console.log('the current channel', socket.room);
        socket.broadcast.in(socket.room).emit('chat', { time: new Date(), name: data.name || 'anonymous', text: data.text });
    });
    // if a client joins a channel
    socket.on('join', function (room) {
    // store the room name in the socket session for this client
    socket.room = room;
    // send client to room 1
    socket.join(room);
    console.log('Client joined room ' + room);
    });
});

// Log port number in the console
console.log('Server running under http://127.0.0.1:' + conf.defaultPort + '/');

}
var conf=require('./config.json');
var cluster=require('cluster');
var os=要求(“os”);
if(cluster.isMaster){
//我们创建一个HTTP服务器,但不使用侦听
//这样,我们就有了一个不接受连接的socket.io服务器
var server=require('http')。createServer();
var io=require('socket.io')。侦听(服务器);
var redis=require('socket.io redis');
适配器(redis({host:conf.redisUri,port:conf.redisPort}));
setInterval(函数(){
//所有工人都将在Redis中接收此信息,并发出
emit('chat',{time:new Date(),text:'payload'});
},conf.syncIntervall);
//设定工人人数
对于(var i=0;i
它可能有用: