使用Node.js、Websocket-Socket.IO和Redis进行简单聊天的多个实例
我正在尝试使用Socket.IO创建一个带有Node.JS和Websocket的简单聊天应用程序。我从中得到启发,对于单个后端实例,它工作得很好 我想在后端有两个服务器实例,它们应该互相同步聊天信息,并将聊天历史记录存储在redis中。加入新聊天室后,客户端应显示当前频道的最后10条消息 我试图应用这个解决方案,但遇到了一些问题。首先我得到 到“ws://localhost:8080/socket.io/?EIO=3&transport=WebSocket&sid=leqgvy0cvk9yaszbaaa”的WebSocket连接失败:在收到握手响应之前连接已关闭 控制台中的错误。其次,两个客户端都在1秒的间隔内接收“有效负载”消息。我可能不理解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
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
它可能有用: