2017-08-23 13 views
0

エクスプレスサーバでは、socket.ioとRedis pubsubを使用しています。 サーバーはRedisメッセージチャネルに加入し、誰かがRedis経由で新しいメッセージを発行すると、特定のWebSocketクライアントにRedisメッセージを転送します。エクスプレスで特定のsocket.ioクライアントにpubsubメッセージを転送します。

私がsocket.ioとRedisのドキュメントから読んだところから、可変部socketを使用して特定のクライアントにメッセージを送信し、socket.broadcast.to(mySocketID).emitを呼び出すことができます。

しかし、次のコードでは、io.on('connection')の範囲外の、赤いサブスクライバ内のmySocketIDにメッセージを送信したい場合はどうすればよいですか?

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

(私はあなたが何をしようとして理解していれば)私はしばらく前にWebSocketを持つ似た何かをしました。効果的には、私はRedis Pub/Sub(plain ol 'EventEmitter)とwebsocketの間にインプロセスイベントプロキシレイヤーを作成しなければなりませんでした。このレイヤーがなければ、不要な接続オーバーヘッドがたくさんあります。これを使用すると、開いている接続の数をRedisに制限できます。

したがって、subscriber.onセクションはEventEmitterイベント(yourEventsObject.emit(/*...*/))を送信します。 socket.io接続コールバックの中で、これらのイベントにリスナー(yourEventsObject.on(/*...*/))で応答します。あなたのsocket.io接続が終了すると、これらのEventEmitterリスナを確実にクリアして、クローズドソケットでエラーが発生しないようにする必要があります。

full source onarticle describing the problem/solution with websocketsのフルファイルです。

関連する問題