【问题标题】:Socket.io - send different data to sender and clients?Socket.io - 向发送者和客户端发送不同的数据?
【发布时间】:2013-11-26 13:57:10
【问题描述】:

我正在学习NodeJS和Socket.IO,一直在学习各种教程,主要是做一个基本的聊天室。

到目前为止,我的应用运行良好:能够与能够移动到不同“房间”的客户一起发送消息。

现在我正在尝试整理它,让它看起来很重要。

我对以下想法感到困惑:

当用户 A 从房间 A 移动到 B 时,会发送一个 emit() 方法来更新一个包含用户计数的数组,然后将其发送回发送者。然后更新侧面板中的房间列表,例如房间 A (0),房间 B (1)。

现在,将新数据发送给发送者很容易并且有效,房间列表得到更新,并且其他房间(发送者不在)具有超链接(这是用户在房间之间移动的方式)

但我想向其他客户发送数据,因此他们的房间列表也会更新。发送与之前相同的数据意味着其他客户端的房间列表不正确,因为数据引用的是发送者加入的新房间名称,而不是其他客户端当前所在的房间。

一些代码:

socket.on('switchRoom', function(data) {
    var newroom = sanitize(data).escape().trim();

    socket.leave(socket.room);

    socket.join(newroom);

    socket.room = newroom;

    socket.emit('updaterooms', rooms, newroom);

    // this is the problem area, socket.room should be the socket.room data for the non-sending client
    //socket.broadcast.emit('updaterooms', rooms, socket.room);
});

我如何向所有其他客户端(不是发送者)发送包含在他们自己的套接字“会话”(即 socket.room)中的数据?

【问题讨论】:

  • 所以您希望广播应该发送到所有套接字而不是自身套接字?我的理解正确吗?
  • 是的!因此,当用户 A 切换房间并触发“switchRoom”时,我希望用户、B、C 和 D 接收“socket.broadcast.emit('updaterooms', rooms, socket.room)”,其中“socket.room”是他们自己的房间数据。

标签: javascript node.js websocket socket.io


【解决方案1】:

您将需要发出适合每个套接字的生成消息。您需要做的是遍历每个套接字,根据每个套接字发出自定义消息,例如:

io.sockets.on('connect', function(socket) {
    socket.on('switchRoom', function(data) {
        var newroom = sanitize(data).escape().trim();

        socket.leave(socket.room);

        socket.join(newroom);

        socket.room = newroom;

        socket.emit('updaterooms', rooms, newroom);

        io.sockets.clients.forEach(function(client) {
            if (socket != client) {
                client.emit('updaterooms', rooms, client.room);
            }
        });
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 2013-12-31
    • 2014-07-28
    • 1970-01-01
    • 2014-08-17
    • 2019-06-29
    • 2018-10-19
    • 2022-07-08
    相关资源
    最近更新 更多