首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >socket.io-redis模块不能跨服务器工作

socket.io-redis模块不能跨服务器工作
EN

Stack Overflow用户
提问于 2017-07-22 09:37:45
回答 1查看 2.1K关注 0票数 1

嘿,伙计们,我正在尝试按照socket.io-redis文档实现socket.io-redis模块。当将消息从一个客户端广播到同一服务器上的另一个客户端时,它工作得很好。但是,当我运行两个相同的服务器时,一个在端口80上,另一个在端口81上,并尝试在客户端A(连接到端口80)和客户端B(连接到端口81)之间广播消息,没有消息通过。这是我的代码:

代码语言:javascript
复制
const client = require('redis').createClient()
const io = require('socket.io')(server)
const redis = require('socket.io-redis')
io.adapter(redis({ host: 'localhost', port: 6379 }))

io.on('connection', function(socket) {
      socket.on('initializeSocket', function(data) {
                //Assign socket id to client id lookup value
                var clientID = JSON.parse(data).clientID

                client.set(clientID, socket.id)
                console.log("%s client ID redis lookup set to:", clientID)
                console.log(socket.id)
      })

      socket.on('personalMessage-client', function(data) {

                ...

                client.get(facebookID, function(err, socketID) {
                   if(socketID) {
                   console.log('broadcasting to %s', socketID)
                   socket.broadcast.to(socketID).emit('personalMessage-server', message)
                   }
                })
      })
})

在初始化套接字连接时,客户端的用户ID被设置为redis中对应socket.id的键值对,并使用以下命令进行检索:

代码语言:javascript
复制
client.get(facebookID, function(err, socketID) {
                   if(socketID) {
                   console.log('broadcasting to %s', socketID)
                   socket.broadcast.to(socketID).emit('personalMessage-server', message)
                   }
                })

redis-cli monitor表明消息实际上正在发布,据我所知,如果两个websocket服务器都连接到同一个redis服务器,则websocket消息应该能够在具有不同地址的服务器之间传递。

但是,当在不同端口上使用两个相同的服务器时,客户端A不会收到来自客户端B的消息。客户端A只有在使用与客户端B相同的端口连接到服务器时才能接收消息。

如果有人能帮上忙,我将不胜感激,就我所知,我使用的socket.io-redis适配器模块是完全错误的。

EN

回答 1

Stack Overflow用户

发布于 2017-07-22 10:11:42

尝试传入subClientpubClient,这对我来说很好。

代码语言:javascript
复制
var redisAdapter = require('socket.io-redis');
var redis = require('redis');
var pub = redis.createClient('6379', '127.0.0.1');
var sub = redis.createClient('6379', '127.0.0.1');
io.adapter(redisAdapter({
    key: 'adapterKey',
    pubClient: pub,
    subClient: sub,
}));

再看看你发布的截图,似乎端口号在62000+范围内,这是你的redis端口号吗?您正在为socket.io-redis模块发送6379(默认端口)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45249800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档