0

我写了一个简单的脚本(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);
    });

但它不起作用。

任何想法如何解决私人房间的问题?

谢谢。

4

2 回答 2

2

我认为您不能将额外的参数传递给 socket.io 连接命令,然后将它们放入服务器中。如果我错了,有人纠正我。我在 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);
    });
  });
});
于 2011-12-16T21:30:17.727 回答
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 和会话的文章。

于 2011-12-16T23:20:15.937 回答