Javascript Socket IO-如何让多个管理员用户访问多个URL上的多个私人房间
我已经找了很久很久了。我通常熟悉灯组,所以道歉-我正在学习节点,因为我正在尝试构建聊天功能-类似于对讲机/漂移的工作方式 我被引导相信Socket.io是解决这个问题的一个好方法,我遇到了一点麻烦。基本概述如下:Javascript Socket IO-如何让多个管理员用户访问多个URL上的多个私人房间,javascript,node.js,express,websocket,socket.io,Javascript,Node.js,Express,Websocket,Socket.io,我已经找了很久很久了。我通常熟悉灯组,所以道歉-我正在学习节点,因为我正在尝试构建聊天功能-类似于对讲机/漂移的工作方式 我被引导相信Socket.io是解决这个问题的一个好方法,我遇到了一点麻烦。基本概述如下: 用户可以使用“我的服务”在其网站上启用实时聊天功能(每个用户都有一个唯一的API密钥) 他们可以将聊天添加到任意数量的网页/域(通过脚本标记) 聊天应该是网站的任何单一最终用户和脚本标签管理员(用于在页面上包含脚本的API密钥的所有者)之间的私人聊天 我在这方面遇到了麻烦 我应该
- 用户可以使用“我的服务”在其网站上启用实时聊天功能(每个用户都有一个唯一的API密钥)
- 他们可以将聊天添加到任意数量的网页/域(通过脚本标记)
- 聊天应该是网站的任何单一最终用户和脚本标签管理员(用于在页面上包含脚本的API密钥的所有者)之间的私人聊天
我在这方面遇到了麻烦 我应该为每个URL创建动态名称空间,还是它是一个文件室 假设我在客户端创建了一个独特的动态房间,例如 除了最终用户之外,唯一能够看到这个聊天的人是API密钥的管理员,我不知道如何实现 我意识到我可能需要某种DB来跟踪聊天室等。关于如何学习如何实现这类事情,有什么好的资源吗 非常感谢您的帮助
我只想在这个问题上做一点扩展,也许是为了我自己,在解决这个问题的时候
- 可以有许多管理员(唯一的API)
- 管理员只负责他们自己的聊天-他们看不到任何不属于他们API密钥的聊天
- 许多用户可以与一个管理员(私下)聊天
- 所有聊天都是1比1
- 因此,最终用户和管理员用户将使用不同的客户端
- 管理员可以与个人用户进行多次聊天
- 用户通常会与一位管理员进行一次聊天
- 管理员不能创建聊天记录(只接收传入信息),但当然可以回复
initiateChat
消息,其中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);
});
});