Javascript Socket IO-如何让多个管理员用户访问多个URL上的多个私人房间

Javascript Socket IO-如何让多个管理员用户访问多个URL上的多个私人房间,javascript,node.js,express,websocket,socket.io,Javascript,Node.js,Express,Websocket,Socket.io,我已经找了很久很久了。我通常熟悉灯组,所以道歉-我正在学习节点,因为我正在尝试构建聊天功能-类似于对讲机/漂移的工作方式 我被引导相信Socket.io是解决这个问题的一个好方法,我遇到了一点麻烦。基本概述如下: 用户可以使用“我的服务”在其网站上启用实时聊天功能(每个用户都有一个唯一的API密钥) 他们可以将聊天添加到任意数量的网页/域(通过脚本标记) 聊天应该是网站的任何单一最终用户和脚本标签管理员(用于在页面上包含脚本的API密钥的所有者)之间的私人聊天 我在这方面遇到了麻烦 我应该

我已经找了很久很久了。我通常熟悉灯组,所以道歉-我正在学习节点,因为我正在尝试构建聊天功能-类似于对讲机/漂移的工作方式

我被引导相信Socket.io是解决这个问题的一个好方法,我遇到了一点麻烦。基本概述如下:

  • 用户可以使用“我的服务”在其网站上启用实时聊天功能(每个用户都有一个唯一的API密钥)
  • 他们可以将聊天添加到任意数量的网页/域(通过脚本标记)
  • 聊天应该是网站的任何单一最终用户和脚本标签管理员(用于在页面上包含脚本的API密钥的所有者)之间的私人聊天

我在这方面遇到了麻烦

我应该为每个URL创建动态名称空间,还是它是一个文件室

假设我在客户端创建了一个独特的动态房间,例如

除了最终用户之外,唯一能够看到这个聊天的人是API密钥的管理员,我不知道如何实现

我意识到我可能需要某种DB来跟踪聊天室等。关于如何学习如何实现这类事情,有什么好的资源吗

非常感谢您的帮助


我只想在这个问题上做一点扩展,也许是为了我自己,在解决这个问题的时候

  • 可以有许多管理员(唯一的API)
  • 管理员只负责他们自己的聊天-他们看不到任何不属于他们API密钥的聊天
  • 许多用户可以与一个管理员(私下)聊天
    • 所有聊天都是1比1
  • 因此,最终用户和管理员用户将使用不同的客户端
    • 管理员可以与个人用户进行多次聊天
    • 用户通常会与一位管理员进行一次聊天
  • 管理员不能创建聊天记录(只接收传入信息),但当然可以回复

我认为您不想使用名称空间,因为这样您的服务器就必须在服务器上预先侦听每个可能的名称空间,以便侦听到它的连接。这似乎不切实际,效率低下。有许多不同的可能方案。我认为这是一个相当容易实现的方法

  • 您可以为此管理员聊天创建一个命名空间
  • 您的服务器侦听该名称空间并接受到该名称空间的传入连接
  • 当客户端需要与管理员聊天时,会连接到该名称空间
  • 然后,客户端发送一条
    initiateChat
    消息,其中API_键作为数据
  • 服务器被编码为在收到带有有效API_密钥的
    initiateChat
    之前不接受任何其他消息
  • 当服务器收到
    initiateChat
    消息时,它会在数据库中查找API_密钥,如果在数据库中找到该密钥,并且该用户当前处于联机状态,则会启动与他们的聊天会话。如果它们当前不可用,它将向客户端发送一条消息,指示它们当前未联机
  • 现在,与聊天相关的消息的套接字已打开
  • 如果需要,可以使用动态创建的房间名称跟踪两个端点,并将两个套接字连接到该房间
  • 如果管理员用户可以使用同一个套接字参与多个聊天,那么您必须确保它发送的聊天信息标有它们所属的聊天室,以便您知道在服务器上向哪个聊天室发送消息

  • SocketIO服务器如何监听动态名称空间,先生?@Quỳ恩古伊ễ不知道你的意思。它需要在服务器上的(“连接”、…)上的
    io.of(“someNamespace”)。才能侦听命名空间。因此,您不能侦听不知道名称的名称空间,您必须单独侦听每个名称空间。名称空间可能是一个错误的工具,因为有很多。在我的回答中,我描述了一种更好的方式来接受与许多不同潜在聊天的连接。你读过并理解我在回答中的建议了吗?@Quỳ恩古伊ễ我想你不明白我的建议。它可以与多个管理员完美配合。当您在服务器上收到
    initiateChat
    消息时,您只需使用服务器逻辑根据传递的API_密钥确定它应该连接到哪个管理员。这比尝试创建许多名称空间侦听器要简单得多。@shanehoban-您不需要使用会话ID。您只需为房间名称创建一个新的唯一ID即可。它可以是一个随机数加上当前日期时间,变成一个字符串。然后,您将其反馈给管理员,管理员会将其与消息一起发送给您,您知道他们将发送给哪个聊天室。对于最终用户,如果他们一次只能参加一次聊天,那么您可以在他们的套接字对象上设置聊天ID,以便他们发送消息时,您知道要发送到哪个房间。@shanehoban-FYI,这是一个用于生成唯一ID的简单小库:。它结合了数字、随机数、日期时间和计数器,因此ID总是唯一的。
    // client side code
    var dynamicRoomName = API_KEY + "_" + fullURL  + "_" + expressSessionId;
    var socket = io.connect();
    socket.emit('create room', dynamicRoomName);
    
    // server side code
    io.sockets.on('connection', function(socket) {
      socket.on('create room', function(room) {
        socket.join(room);
      });
    });