Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js socket.io在一个页面上进行多个聊天_Node.js_Sockets_Socket.io_Chat_Chatroom - Fatal编程技术网

Node.js socket.io在一个页面上进行多个聊天

Node.js socket.io在一个页面上进行多个聊天,node.js,sockets,socket.io,chat,chatroom,Node.js,Sockets,Socket.io,Chat,Chatroom,我想在一个页面上实现多个聊天窗口(比如facebook)。 目前使用“房间”,简化代码: [客户端] socket.emit('join', 'room1'); socket.emit('join', 'room2'); socket.on('join', function(room) { socket.join(room); }); var room = 'room1'; socket.on(room + '.new_message', function() { // ap

我想在一个页面上实现多个聊天窗口(比如facebook)。 目前使用“房间”,简化代码:

[客户端]

socket.emit('join', 'room1');
socket.emit('join', 'room2');
socket.on('join', function(room)
{
    socket.join(room);
});
var room = 'room1';
socket.on(room + '.new_message', function()
{
    // append message to chat
});
io.sockets.in('room1').emit('room1.new_message', 'some message');
[服务器]

socket.emit('join', 'room1');
socket.emit('join', 'room2');
socket.on('join', function(room)
{
    socket.join(room);
});
var room = 'room1';
socket.on(room + '.new_message', function()
{
    // append message to chat
});
io.sockets.in('room1').emit('room1.new_message', 'some message');
所以,客户端上的每个单独的聊天室都是一个单独的类,它处理聊天逻辑,它必须只接收来自服务器的事件,用于连接的聊天室。但如果是一个页面,则使用一个套接字连接,因此如果一个套接字将连接到多个房间,那么订阅一个房间,也将从另一个房间接收事件。我该如何分开这个

我在想这些方法:

  • 强制每个房间连接新的插座(因此10次聊天=10个插座),我认为这不是一个好主意,因为高负载(如果我不正确,请纠正我)
  • 客户端事件的前缀,例如,如果我想处理特定房间的事件,我将按如下方式订阅:
  • [客户端]

    socket.emit('join', 'room1');
    socket.emit('join', 'room2');
    
    socket.on('join', function(room)
    {
        socket.join(room);
    });
    
    var room = 'room1';
    socket.on(room + '.new_message', function()
    {
        // append message to chat
    });
    
    io.sockets.in('room1').emit('room1.new_message', 'some message');
    
    [服务器]

    socket.emit('join', 'room1');
    socket.emit('join', 'room2');
    
    socket.on('join', function(room)
    {
        socket.join(room);
    });
    
    var room = 'room1';
    socket.on(room + '.new_message', function()
    {
        // append message to chat
    });
    
    io.sockets.in('room1').emit('room1.new_message', 'some message');
    
    这是个好主意吗


    如果是其他方法,请与我共享。

    一个房间一个插座,打开多个插座没有问题。

    我认为您只创建一个插座连接到服务器。但一个插座可以连接多个房间。 当服务器发送到客户端时,您必须确定房间发送。 示例:socket.broadcast.to(room.emit(..…{data:idRoom});。 当客户端从服务器接收套接字时。它必须确定弹出窗口将接收消息。您可以使用来自服务器的idRoom来确定弹出窗口接收。

    对不起,我的英语不好

    你的问题解决了吗?我正在尝试执行相同的签出
    名称空间