socket.io将发送到所有房间而不是指定的房间

时间:2017-07-18 17:33:23

标签: node.js express socket.io

我是node和socket io的新手。我试图为自己的几个应用程序实现实时通知系统。因此,使用node,express和socket io,代码如下:

服务器端代码:

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

    socket.on('subscribe', function(room) {
        socket.join(room);
    });

    socket.on('unsubscribe', function(room) {
        socket.leave(room);
    });
});

客户端代码:

var sio = io.connect('http://localhost:9000');

var ch1 = sio.emit('subscribe', 'channel1');

ch1.on('log', function (data) {
    console.log('channel1: ', data);
});

var ch2 = sio.emit('subscribe', 'channel2');

ch2.on('log', function (data) {
    console.log('channel2: ', data);
});

我从路线(快车)开火/发射事件,例如:

app.get('/', function(req, res) {

    var data1 = {
        channel: 'channel1',
        evennt: 'log',
        message: 'Hello from channel1...'
    };

    io.to(data1.channel).emit(data1.event, data1);
});

当我点击路线时,io.to(data1.channel).emit(data1.event, data1);正在运行,但它将数据发送到两个房间/频道,但我希望仅在ch1中获取数据,因为{{1}包含data1.channel所以我期待以下处理程序将接收数据:

channel1

请注意,两个频道都有相同的ch1.on('log', function (data) { console.log('channel1: ', data); }); 事件。我是在正确的轨道上。它有可能吗?

1 个答案:

答案 0 :(得分:0)

var ch1 = sio.emit('subscribe', 'channel1');
var ch2 = sio.emit('subscribe', 'channel2');

您正在为两个房间订阅相同的套接字(sio)。此外,ch1ch2是对sio的引用。

如果要正确测试,应为第二个频道创建第二个套接字:

var sio2 = io.connect('http://localhost:9000');
var ch2  = sio2.emit('subscribe', 'channel2');