嘿伙计们我正按照socket.io-redis文档尝试实现socket.io-redis模块。在将消息从一个客户端广播到同一服务器上的另一个客户端时,它工作正常。但是当我运行两个相同的服务器时,一个在端口80上,一个在端口81上,并尝试在客户端A(连接到端口80)和客户端B(连接到端口81)之间广播消息,没有消息通过。这是我的代码:
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的键值对,并使用以下方法检索:
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适配器模块。
答案 0 :(得分:0)
尝试传递subClient
和pubClient
,这对我来说很好。
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(默认端口)。