Node.js socket.io交换名称空间

Node.js socket.io交换名称空间,node.js,sockets,socket.io,namespaces,Node.js,Sockets,Socket.io,Namespaces,我目前正在使用socket.io进行简单的聊天。这些基础已经开始工作了,但是现在我尝试实现两个不同的名称空间。我希望客户端能够通过按钮单击从一个名称空间(支持聊天)切换到另一个名称空间(朋友聊天) 服务器端 //default namespace io.on('connection', function(socket){ console.log('a user connected to the chat'); socket.on('disconnect', function()

我目前正在使用socket.io进行简单的聊天。这些基础已经开始工作了,但是现在我尝试实现两个不同的名称空间。我希望客户端能够通过按钮单击从一个名称空间(支持聊天)切换到另一个名称空间(朋友聊天)

服务器端

//default namespace
io.on('connection', function(socket){
    console.log('a user connected to the chat');

    socket.on('disconnect', function(){
        console.log('user disconnected');
    });

    socket.on('client message', function(msg){
        io.emit('server_message', msg);
    });
});

//namespace /support
var sup = io.of('/support');
sup.on('connection', function(socket){
    console.log('someone entered the support-chat');

    socket.on('disconnect', function(){
        console.log('user disconnected from support-chat');
    });

    //recieving and emitting message to all clients in namespace /support
    socket.on('client message', function(msg){
        console.log('message received: ' + msg);
        io.of('/support').emit('server_message', msg);
    });
});

//namespace /friends
var frnd = io.of('/friends');
frnd.on('connection', function(socket){
    console.log('someone entered the friends-chat');

    socket.on('disconnect', function(){
        console.log('user disconnected from friends-chat');
    });

    //recieving and emitting message to all clients in namespace /friends
    socket.on('client message', function(msg){
        console.log('message received: ' + msg);
        io.of('/friends').emit('server_message', msg);
    });
});
var socket = io.connect();
//toggle namespace
            $("#support_button").click(function(){
                socket.disconnect();
                socket = io('/support');
                $('#messages').append($('<li>').text("You entered the Support-Chat"));
            });
//toggle namespace
            $("#friends_button").click(function(){
                socket.disconnect();
                socket = io('/friends');
                $('#messages').append($('<li>').text("You entered the Friends-Chat"));
            });
//sending message on submit
            $('form').submit(function(){
                socket.emit('client message', $('#m').val());
                $('#m').val('');
                return false;
            });
//recieving message and display
            socket.on('server_message', function(msg){
                $('#messages').append($('<li>').text(msg));
            });
        });
客户端

//default namespace
io.on('connection', function(socket){
    console.log('a user connected to the chat');

    socket.on('disconnect', function(){
        console.log('user disconnected');
    });

    socket.on('client message', function(msg){
        io.emit('server_message', msg);
    });
});

//namespace /support
var sup = io.of('/support');
sup.on('connection', function(socket){
    console.log('someone entered the support-chat');

    socket.on('disconnect', function(){
        console.log('user disconnected from support-chat');
    });

    //recieving and emitting message to all clients in namespace /support
    socket.on('client message', function(msg){
        console.log('message received: ' + msg);
        io.of('/support').emit('server_message', msg);
    });
});

//namespace /friends
var frnd = io.of('/friends');
frnd.on('connection', function(socket){
    console.log('someone entered the friends-chat');

    socket.on('disconnect', function(){
        console.log('user disconnected from friends-chat');
    });

    //recieving and emitting message to all clients in namespace /friends
    socket.on('client message', function(msg){
        console.log('message received: ' + msg);
        io.of('/friends').emit('server_message', msg);
    });
});
var socket = io.connect();
//toggle namespace
            $("#support_button").click(function(){
                socket.disconnect();
                socket = io('/support');
                $('#messages').append($('<li>').text("You entered the Support-Chat"));
            });
//toggle namespace
            $("#friends_button").click(function(){
                socket.disconnect();
                socket = io('/friends');
                $('#messages').append($('<li>').text("You entered the Friends-Chat"));
            });
//sending message on submit
            $('form').submit(function(){
                socket.emit('client message', $('#m').val());
                $('#m').val('');
                return false;
            });
//recieving message and display
            socket.on('server_message', function(msg){
                $('#messages').append($('<li>').text(msg));
            });
        });
我是否误解了名称空间的用法?我想在2个主聊天室的名称空间“拆分”后立即实现聊天室,以获得支持和朋友。 还是我在服务器端实现了错误的名称空间?我认为io.on(..)、io.of('/support')、on(..)和io.of('/friends')。on(..)都以相同的方式工作,并捕获它们自己的名称空间客户端的事件

非常感谢您的帮助!我觉得名称空间在“基本用法”文档中被忽略了。

您不能在现有连接上“切换”名称空间。当建立连接时,您连接到一个特定的名称空间,一旦建立,它就不能被更改

您可以删除当前连接并使用新连接连接到新命名空间。但是,考虑到您的应用程序,如果您想切换名称空间,而应该使用房间,那么您就误用了名称空间的概念

对于房间,客户端可以向服务器发送交换房间的请求,然后服务器可以将用户从现有房间中删除并添加到新房间。然后,通过服务器,您可以轻松地向给定房间中的所有连接进行广播

事实上,聊天室是围绕聊天的概念发明的(尽管它们还有许多其他用途),因此它们非常适合您希望实现的聊天室

名称空间比房间更重。建立连接时,连接必须连接到特定的命名空间,并且在连接过程中不能更改该命名空间

另一方面,房间要灵活得多。服务器可以放置给定的连接,随时从一个房间添加或删除连接,甚至一个连接可以位于多个房间中

文件室和名称空间都支持向该集合中的所有用户广播

我认为名称空间更像是功能通道。因此,我想连接到“价格”更改名称空间以获取价格更改通知,或者连接到“系统”名称空间以获取有关系统中发生的事件的警报,或者发送消息以管理系统中的事件


然而,聊天室是对共享信息感兴趣的用户的任意集合,我可能在不止一个聊天室。

这是一个很好的答案,正是我需要知道的!非常感谢!