socket.io 切换命名空间

2024-06-26

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

服务器端

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

我认为开关本身正在工作,因为连接和断开事件正在按其应有的方式触发。但是,当涉及到向同一名称空间中的每个人发送消息(服务器已经从客户端收到消息)时,它不起作用。

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

io.of('namespace').emit();

我是否误解了命名空间的用法?我想在两个主要聊天的命名空间“分割”之后立即实现房间,以获得支持和朋友。 或者我在服务器端实现了错误的名称空间?我认为 io.on(..)、io.of('/support').on(..) 和 io.of('/friends').on(..) 都以相同的方式工作并捕获他们自己的命名空间-客户端的事件。

非常感谢任何帮助!我觉得命名空间在“基本用法”文档中被忽视了。


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

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

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

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

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

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

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

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

而房间是有兴趣共享信息的用户的任意集合,而我可能位于多个房间中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io 切换命名空间 的相关文章

随机推荐

  • 如何在 Linux 上正确地将网络接口置于混杂模式

    那么如何正确地做到这一点呢 我知道如何通过创建套接字 然后使用 ioctl 设置 IFF PROMISC 标志来做到这一点 如 如何在C中检查网络设备状态 https stackoverflow com questions 3055622
  • 转置矩阵存储在一维数组中,无需使用额外的内存[重复]

    这个问题在这里已经有答案了 可能的重复 矩阵的就地转置 https stackoverflow com questions 9227747 in place transposition of a matrix 最近参加了技术笔试 通过以下问
  • 在 React Native 中实现警报的最佳方法?

    我需要将警报功能添加到我的反应本机应用程序中 您必须手动停止 暂停的闹钟像这些 https www androidauthority com alarm clock apps android 101618 为此 我一直在浏览以了解应该实施哪
  • 将 WinForms ListBox 绑定到对象属性

    我第一次做一些 WinForms 编码 并尝试使用数据绑定 我有一个列表框 我将其绑定到控制器对象中的字符串数组 并且我还想将列表框中的 SelectedItem 绑定到控制器上的另一个字符串属性 以便我可以跟踪它 listBox Data
  • Codemirror光标位置偏移

    我正在使用代码镜像在网页中显示 突出显示和编辑 xml 但我遇到了光标位置偏离插入位置的问题 因此 如果从闪烁光标所在的位置删除字符 则删除之前的字符您期望的那个会被删除 我假设它与我当前页面存在 css 冲突 因为它在我的页面之外运行良好
  • 有没有办法在 Nokogiri css 中转义非字母数字字符?

    我有一个锚标签 file html stuff morestuff CHP 1 SECT 2 1 尝试提取 Nokogiri 中引用的内容 documentFragment at css stuff morestuff CHP 1 SECT
  • Celery未注册任务KeyError

    我通过在终端中执行以下命令来启动工作程序 celery A cel test worker loglevel INFO concurrency 10 n worker1 h 然后我收到一条长循环错误消息 指出 celery 已收到未注册的任
  • 没有绑定 play.db.Database 的实现

    我在使用 hikaricp 时访问数据库时遇到问题 这是我的reference conf play modules enabled play api db DBModule enabled play api db HikariCPModul
  • 将两个工作区文件夹映射到同一工作目录

    我正在将构建系统从 VSS 迁移到 TFS VSS 解决方案的一部分将两个 VSS 项目中的选定文件获取到同一目录中 由于 TFS 强制您在获取之前显式设置工作文件夹 因此我不确定这是否有效 我在单独使用时遇到了问题工作空间彼此的工作目录重
  • 扩展 AppCompatActivity 与扩展 flutterActivity

    为了https flutter dev docs development platform integration platform channels tab android channel java tab step 3 add an a
  • Three.js轨迹球控制无滚动

    有谁知道是否 如何修改轨迹球控件以保持地平线水平 但仍然允许您在物体周围和上方旋转 通过将 axis x 和 axis z 设置为 0 它会停止滚动 但也会停止在对象上旋转的能力 轨道控制接近我正在寻找的东西 但没有平移的能力 有什么帮助吗
  • 如何让 SVN ADD 忽略二进制文件

    二进制文件 在 Linux 下 没有扩展名 因此我无法使用模式排除它们 因此当我使用SVN add添加一个目录我会得到类似的东西 svn add recursion vector A recursion vector A recursion
  • 平面文件源的sql server数据工具动态文件名

    我有一个 ssis 包 它可以将文本文件中的数据足够简单地导入到数据库表中 导入文件名需要配置为动态源 因为文件名会改变 所以我的文件名将具有以下模式 bookNames Shopping 05 02 2016 txt gt bookNam
  • SSRS 显示前 n 个,但 SUM 包含所有值

    我目前在 SSRS 中有一个包含多行的 tablix 但我希望只显示前 5 行 但底部的总列包含表中的行数的值 例子 NameID Sales of Total 1 100 4 70 3 65 2 50 7 35 DO NOT DISPLA
  • dotnet 使用 gitlab-ci 为傻瓜发布

    我正在尝试使用 gitlab ci 设置 ci 我对此有几个问题 gitlab ci 上好像没有回滚机制 那么如果部署阶段失败我应该关心回滚吗 我计划使用 dotnetpublishSolution sln crelease 脚本 但我在这
  • 中断、保存并稍后继续循环的最佳方法

    事情是这样的 我有一个需要几天时间才能运行的循环 我想中断循环 检查进度 然后稍后继续 目前 我正在使用以下内容 for i in 1 100000 Sys sleep i 2 5 print i write csv i i csv 我检查
  • 将 WordPress 用户导入 Firebase 身份验证

    我正在将我的 Wordpress 网站迁移到 Firebase 我已成功将我的 Wordpress 用户导出为下面的 JSON 格式 如中所述文档 https firebase google com docs cli auth 我相信 Wo
  • 基于布尔 prop 的条件字段验证

    我想要favoriteAlcohol仅当以下情况时才需要验证 需要的字段props isAdult传递给组件的是true Yup object shape favoriteAlcohol Yup string when props isAd
  • wpf C# 中的内存泄漏

    我正在使用 GalaSoft MvvmLight 套件和 WPF Toolkit 开发 WPF MVVM v3 5 中 应用程序DataGrid and DatePicker 但是 每次加载应用程序时 我都会面临应用程序中的大量内存泄漏Us
  • socket.io 切换命名空间

    我目前正在与 socket io 进行简单的聊天 基础知识已经可以工作 但现在我正在尝试实现 2 个不同的命名空间 我希望客户端能够通过单击按钮从一个命名空间 支持聊天 切换到另一个命名空间 朋友聊天 服务器端 default namesp