socket.io切换名称空间

Exa*_*aMa 3 sockets namespaces node.js socket.io

我目前正在与socket.io进行简单的聊天。基础知识已经可以使用,但是现在我正在尝试实现2个不同的名称空间。我希望客户端能够通过一次buttonclick从一个名称空间(支持聊天)切换到另一个名称空间(朋友聊天)。

服务器端

//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);
    });
});
Run Code Online (Sandbox Code Playgroud)

客户端

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));
            });
        });
Run Code Online (Sandbox Code Playgroud)

我认为交换机本身正在工作,因为连接和断开事件正在按应有的方式触发。但是,当向同一命名空间中的每个人发送消息(服务器已经从客户端接收到该消息)时,它就无法正常工作。

这不是在特定名称空间中发出的服务器端调用吗?:

io.of('namespace').emit();
Run Code Online (Sandbox Code Playgroud)

我会误解名称空间的用法吗?我想在2个主要聊天室的名称空间-“ split”之后实现支持和朋友的房间。还是在服务器端实现了错误的名称空间?我以为io.on(..),io.of('/ support')。on(..)和io.of('/ friends')。on(..)都以相同的方式工作并捕获了自己的名称空间-客户端事件。

任何帮助深表感谢!我觉得在“基本用法”文档中,名称空间已经被忽略了。

jfr*_*d00 6

您不能在现有连接上“切换”名称空间。建立连接后,您将连接到特定的名称空间,一旦建立,就无法更改。

您可以删除当前连接,然后使用新连接连接到新的名称空间。但是,对于您的应用程序,如果要切换名称空间,而应该使用房间,则会滥用名称空间的概念。

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

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

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

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

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

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

而会议室是任意有兴趣共享信息的用户的集合,而我可能在多个会议室中。