使用Socket.io区分发送者和接收者

时间:2017-07-06 19:29:42

标签: angularjs node.js express socket.io

我使用JavaScript堆栈(MongoDB,ExpressJS,AngularJS,NodeJS)构建了一个Web应用程序。注册工作,身份验证工作,聊天是使用Socket.io工作,但我需要一种方法来区分哪个客户端正在发送以及哪个客户端正在接收消息,以便使用用户的数据执行更多功能。

P.S。由于这是一个我无法发布的项目,我的帖子中没有代码片段,希望它没关系

3 个答案:

答案 0 :(得分:1)

最终设计将取决于您想要实现的目标。是"一对一聊天"服务或者可能是一对多的广播"。该服务是匿名的吗?您希望用户如何找到对方?它需要多安全?

作为起点,我将为每个连接(客户端)分配唯一标识符(UID)。这将允许服务器通过创建"会话来引导流量。配对或者可能是听众(订阅者)和作者(出版商)的列表。

然后,已连接的用户可以输入第二个已连接用户的UID,您的服务可以使用uid配对来回发送消息。

会话(user123,user0987)
  user123发送给user0987
  user0987发送给user123

或去公告板/聊天室风格:

创建一个" board" - 只是一个目的地,是所有发送文本的列表
 user123"加入"董事会" MiscTalk"
 user0987"加入董事会" MiscTalk"

每个都向服务器发送文本,服务器将该文本添加到电路板,每个客户端轮询电路板以进行更改。

每个套接字都可以发送或接收,您的程序必须跟踪"谁"连接在套接字上并在它们之间引导流量。

答案 1 :(得分:0)

我认为处理客户端的一种好方法是创建一个Handler类,一个Client对象并在处理程序中创建一个clientList,这种方式更容易区分客户端。几个月前,我构建了一个简单的open source one-to-one random chat using socket.io,这里是handlerclient class

我希望这个例子可以帮助你。

答案 2 :(得分:0)

1。)创建一个全局服务器变量并将connections属性绑定到它,每当验证为真时,将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。