【问题标题】:The socket.io is emitting to all rooms instead of the specified onessocket.io 发送到所有房间而不是指定的房间
【发布时间】:2017-12-23 17:18:43
【问题描述】:

我是节点和套接字 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 中获取数据,因为 data1.channel 包含 channel1 所以我期望以下处理程序将接收数据:

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

请注意,两个频道都有相同的log 事件。我在正确的轨道上吗。有可能吗?

【问题讨论】:

  • 你在data1的声明中打错了channel
  • 这是一个错字,但它也不起作用。

标签: node.js express socket.io


【解决方案1】:
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');

【讨论】:

  • 你想创建多个socket,每个socket订阅不同的房间,但所有socket共享同一个连接?对吗?
  • 通过调用sio2 = io.connect('http://localhost:9000') 可以工作,但这是两个不同的连接。
  • 我认为这不可能。如果连接到不同的命名空间,连接会被重用,但当多个客户端连接到同一个命名空间(这是您想要的)时则不会。更多信息:socket.io/docs/client-api/#with-multiplexing
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2023-03-27
  • 2013-08-01
相关资源
最近更新 更多