2017-08-23 65 views
0

消息特定socket.io客戶在我的Express服務器,我使用socket.io和Redis的發佈訂閱。 服務器預訂一個Redis的消息信道,並當有人通過Redis的新發布消息轉發Redis的消息發送到特定的WebSocket客戶端。前進的Redis PubSub的快遞

從我從socket.io和Redis文檔中讀到的內容,我可以使用變量socket和致電socket.broadcast.to(mySocketID).emit向特定客戶端發送消息。

但是,在下面的代碼中,如果我想要發送消息給mySocketID內部的redis用戶,該用戶不在io.on('connection')的範圍內,該怎麼辦?

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

 
io.on('connection', function (socket) { 
 

 
    socket.on('whatever_event', function() { 
 
     socket.broadcast.to(mySocketID).emit('TEST', 'hello ' + mySocketID); 
 
    } 
 
} 
 

 
var subscriber = redis.createClient(); 
 

 
subscriber.on('message', function (channel, redisMessage) { 
 

 
// I want to send redisMessage to the websocket client 
 
// Can I access to "socket" in io.on('connection' ...) ? 
 

 
});

回答

1

我沒有使用WebSockets類似的東西了一段時間後(如果我明白你要做什麼)。有效地,我必須創建Redis的發佈/訂閱(純醇」 EventEmitter)和網頁套接字之間的過程中的事件代理層。如果沒有這個層,你將會有很多不必要的連接開銷,通過使用它你可以限制打開連接到Redis的數量。

因此,subscriber.on部分發送EventEmitter事件(yourEventsObject.emit(/*...*/))。然後你socket.io連接回調裏面你響應這些事件與聽衆(yourEventsObject.on(/*...*/))。當你的socket.io關閉連接,你需要確保和清理這些EventEmitter監聽器,這樣你就不會得到閉合的插座錯誤。

這裏是full source onarticle describing the problem/solution with websockets完整的文件。