我写了简单的脚本(app.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();
});
});
现在,我希望能够为每个用户订阅私人频道。
我试图通过socket.io.connect传递额外的数据,如下所示:
<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>
然后在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);
});
但它不起作用。
如何解决私人房间的问题?
感谢。
答案 0 :(得分:2)
我认为你不能将额外的参数传递给socket.io connect命令,然后在服务器中获取它们。如果我错了,有人纠正我。我无法在socket.io文档中找到它。
无论如何,socket.io已经内置了对房间的支持。在客户端,您可以将join
事件发送到服务器,并附上房间名称
var socket = io.connect('http://localhost:8080');
socket.on('connect', function() {
socket.emit('join', 'secret_hash');
});
socket.on('message', function(msg) {
// got a messae!
});
在服务器上,您可以使用房间功能。
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);
});
});
});
答案 1 :(得分:0)
无需这样做,因为您将复制功能。使用Socket.IO,您可以使客户端加入房间,就像在他们的github页面上所描述的那样:
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的文章。