2011-12-16 6 views
0

私は今node.jsとredisのプライベートチャネル。の仕方?

var app = require('express').createServer() 
, io = require('socket.io').listen(app); 

var redis = require("redis"); 

app.listen(8080); 

////////////// Dev environment; replace by PERL in production use. 
app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
////////////// 

io.sockets.on('connection', function (socket) { 
    socket.subscribe = redis.createClient(); 
    socket.subscribe.subscribe('chat'); 

    socket.subscribe.on("message", function(channel, message) { 
     socket.send(message); 
    }); 

    socket.on('disconnect', function() { 
     socket.subscribe.quit(); 
    }); 

    socket.on('close', function() { 
     socket.subscribe.quit(); 
    }); 
}); 

Redisのチャンネルを購読する簡単なスクリプト(app.jsを)書いて、私は、ユーザーごとにプライベートチャンネルにサブスクライブすることにしたいです。

私はこのようなsocket.io.connectを経由して、余分なデータを渡そうとしました:app.js

... 
io.sockets.on('connection', function (socket, args) { 
    socket.subscribe = redis.createClient(); 
    socket.subscribe.subscribe(args.PRIVATE_ROOM_HASH); 

    socket.subscribe.on("message", function(channel, message) { 
     socket.send(message); 
    }); 

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {'PRIVATE_ROOM_HASH': 'secret_hash'}); 
    socket.on('message', function (data) { 
    console.log(data); 
    }); 
</script> 

、その後、それが動作しません。

個室の問題を解決する方法はありますか?

ありがとうございました。

答えて

2

私はあなたがsocket.io connectコマンドに余分な引数を渡して、それらをサーバで得ることはできないと思います。私が間違っているなら、誰かが私を訂正する私はsocket.ioのドキュメントでこれを見つけることができません。

とにかく、socket.ioには部屋のサポートが組み込まれています。クライアント側では、例えば部屋

var socket = io.connect('http://localhost:8080'); 
socket.on('connect', function() { 
    socket.emit('join', 'secret_hash'); 
}); 

socket.on('message', function(msg) { 
    // got a messae! 
}); 

の名前でサーバーにjoinイベントを送信し、サーバー上で、あなたが特色の部屋を使用します。

io.sockets.on('connection', function(socket) { 
    socket.on('join', function(room) { 
    socket.join(room); 
    socket.on('message', function(msg) { 
     socket.broadcast.to(room).emit('message', msg); 
    }); 
    }); 
}); 
+0

ありがとうDeaDEnD!私はこれが良い解決策だと思う。とにかく、私はredis.createClient()と一緒にいますので、私はアプリケーションの他の部分(例えばPerlのコード)でRedisを使っているのでsocket.joinとsocket.broadcastを使用しません – User

+0

サンプルコードがありますかこのために、私はredisとソケットでlaravelアプリケーションを構築し、私はこれらのプライベートチャネルを作成に固執した – utdev

0

機能を複製するので、これを行う必要はありません。彼らのgithubのページに記載のようにSocket.IOを使用すると、クライアントが部屋に参加することができます:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.join('justin bieber fans'); 
    socket.broadcast.to('justin bieber fans').emit('new fan'); 
    io.sockets.in('rammstein fans').emit('new non-fan'); 
}); 

をまた、あなたが本当の認証をたい場合は、最高のセッションとなり、私はあなたがExpress, Socket.IO and sessionsについての記事を読むことをお勧めします。

関連する問題