Socket.io - 向发件人和客户端发送不同的数据?

时间:2013-11-26 13:57:10

标签: javascript node.js websocket socket.io

我正在学习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);
});

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

1 个答案:

答案 0 :(得分:0)

您需要发出一个生成的消息,该消息可以满足每个套接字的需要。您需要做的是遍历每个套接字,根据每个套接字发出自定义消息,例如:

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);
            }
        });
    });
});