【问题标题】:Distinguish sender from receiver with Socket.io使用 Socket.io 区分发送者和接收者
【发布时间】:2023-03-03 01:16:01
【问题描述】:
我已经使用 JavaScript 堆栈(MongoDB、ExpressJS、AngularJS、NodeJS)构建了一个 Web 应用程序。注册有效,身份验证有效,使用 Socket.io 的聊天有效,但我需要一种方法来区分哪个客户端正在发送以及哪个客户端正在接收消息,以便对用户数据执行进一步的功能。
附:由于这是一个我无法发布的项目,所以我的帖子中没有代码 sn-ps,希望没问题
【问题讨论】:
标签:
angularjs
node.js
express
socket.io
【解决方案1】:
最终的设计将取决于您要达到的目标。是“一对一聊天”服务,也可能是“一对多广播”。服务是匿名的吗?您希望用户如何找到彼此?它需要有多安全?
作为起点,我将为每个连接(客户端)分配一个唯一标识符 (UID)。这将允许服务器通过创建“对话”配对或者可能是侦听器(订阅者)和作者(发布者)列表来引导流量。
然后,连接的用户可以输入第二个连接用户的 UID,您的服务可以使用 uid 配对来回发布消息。
对话(user123,user0987)
user123 发送给 user0987
user0987 发送给 user123
或者去公告板/聊天室风格:
创建一个“板” - 只是一个包含所有已发送文本列表的目的地
user123“加入”板“MiscTalk”
user0987“加入董事会“MiscTalk”
每个向服务器发送文本,服务器将该文本添加到板,每个客户端轮询板以进行更改。
每个 Socket 都可以发送或接收,您的程序必须跟踪“谁”连接到一个套接字上并引导他们之间的流量。
【解决方案3】:
1.) 创建一个全局服务器变量并将连接属性绑定到它,当身份验证为真时,将 socket_id 与解码令牌后获得的 id(user_id 等) 存储起来。
global.server=http.createServer(app);
server.connections={};
如果 server.connection hasOwnProperty(id) 然后使用 socket emit 发送您的消息,
否则将 socket_id 存储在您的 id 上,然后发送您的消息。
这样,您只需要知道目标用户的唯一令牌即可发送消息。
2.) 你也可以使用房间的概念
如果身份验证是真实的使用
socket.room=id ; socket.join(id)
发送消息时使用client.in(id).emit("YOUR-EVENT-NAME",message)
注意:自己制作流程,这只是我过去实现的概述。您应该考虑使用Redis来存储socket_ids。