当我使用socket.io执行pub / sub时,以下代码工作得很好。
基本上,我从浏览器发送聊天消息。在服务器上,我收听此消息并将其发回给所有来自服务器的相同消息。因此,我希望每发送一条消息都会返回/打印1条消息。
通过以下内容,我可以从多个浏览器登录,当我发送聊天消息时,它会按预期返回/打印为单个聊天消息。
io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
socket.on('chat', function (message) {
io.emit('chat', "hello world");
});
});
然而,当我尝试使用redis做pub / sub时,会出现问题。
从第一个浏览器:1个聊天消息导致打印出1个聊天消息
从第二个浏览器:1个聊天消息导致打印出2个聊天消息
从第三个浏览器:1个聊天消息导致打印出3个聊天消息
var sub = redis.createClient();
var pub = redis.createClient();
sub.subscribe('chat');
io.use(socketHandshake({store: sessionStore, key:'jsessionid', secret:'secret', parser:cookieParser()}));
io.on('connection', function (socket) {
socket.on('chat', function (message) {
// io.emit('chat', "hello world");
pub.publish('chat', "hello world");
});
sub.on('message', function (channel, message) {
io.emit(channel, message);
});
});
我错过了什么?我是初学者,我正在使用最新版本的express,socket.io,socket.io-handshake和redis来尝试这个示例http://blog.cloudfoundry.org/2013/01/24/scaling-real-time-apps-on-cloud-foundry-using-node-js-and-redis/。
我对这个redis pub / sub感到难过。请帮忙。
答案 0 :(得分:8)
您为每个连接添加了一个新的“消息”处理程序。这就是为什么你开始看到越来越多的连接越来越多的重复。尝试将sub.on('message', ...);
移到socket.io连接处理程序之外。
答案 1 :(得分:0)
我知道这是一个老问题,但也许这可以帮助为那里的人提供另一种解决方案,我昨天发现这个错误后发现自己是一个解决方案。 尝试改变io.emit(频道,消息); into socket.emit(channel,message);