【问题标题】:Socket.io offline messagesSocket.io 离线消息
【发布时间】:2018-02-06 05:32:48
【问题描述】:

我正在尝试使用 socket.io 创建一个移动聊天应用程序。我计划将消息存储在用户手机上的本地数据库中,这样我就不必对我的数据库执行 http 请求来检索旧消息。我的聊天应用程序包含最多 12 人的房间。

在 socket.io 中,我订阅了一个像这样的房间:socket.join(room 并通过它广播消息。我房间中并连接到套接字的所有用户都会收到消息,并且一切正常,但是我想实现离线消息传递,因此如果有人没有连接,它会将文本保存到数据库中。我的问题是我如何知道哪些用户没有在线接收消息,当我加入特定房间时,我是否通过房间中的用户?因为目前我不知道如何在我的数据库中保存消息,因为 socket 不知道房间里但未连接的人。

【问题讨论】:

  • 您将不必依赖 socket.io 来跟踪房间,因为当用户离线时,它会将用户从房间中移除。相反,房间必须是您保存在数据库中的东西,当用户上线时,您在数据库中查找他们并将他们加入他们应该在的任何 socket.io 房间。同样,当您发送消息时对于一个房间,您必须在数据库中查找该房间,如果该用户当前不在线,则将消息添加到数据库中该用户的消息队列中。

标签: ios node.js sockets socket.io


【解决方案1】:

一种方法是将消息保存到数据库中,并在用户连接到房间时获取它(我有一个聊天应用程序,我们在其中执行此操作。我们将带有房间引用的消息保存到 mongodb 并根据房间 ID 检索它)。 Socket io 不保存任何消息,因此每次用户连接到房间时,您都应该查询数据库并获取所有新消息。由于您拥有手机中所有消息的数据库,因此请使用消息的日期来获取所有新消息。

或者

当用户断开连接时,您可以保留用户的 vs 房间参考信息,您只是有一个参考信息,说明连接到该房间的该用户正在离线,并带有一些时间戳。当用户返回时,使用时间戳从其他客户端检索消息并将这些消息发送给他

【讨论】:

  • 问题是我无法按房间 ID 保存我的消息,因为我只想检索一次,所以我在数据库中为每条消息保存一个单独的行,这样当用户检索消息时,它是从数据库中删除并添加到用户手机上的本地数据库中
  • 我在想的是,当用户连接到房间时,他提供了房间/群聊(在线和离线)中的每个人的数组,并且当发送消息时,它会删除那些从数组接收到消息并在数据库中为数组中的其余用户保存一条记录,其中只有不在线的用户
  • 这不会使事情复杂化。正如您所说的消息在检索后被删除然后房间里的某个人有一个副本只需使用该副本分发给所有离线的人我不知道您的业务场景但我只是说所有人会发生什么如果用户卸载并重新安装您的应用程序并清除他的本地数据库时用户收到的消息
  • 我如何在用户之间分发它,我如何知道谁收到了消息以及谁还需要接收消息。对于清除本地数据库,应用商店中的大多数聊天应用程序都是正常工作的,因此如果您获得新手机或重新安装,您可以从头开始,就像 iPhone 的原生 iMessage 应用程序一样
  • 你是否有用户连接的所有房间的记录,如果你这样做,那么你可以像这样解决它,当用户断开连接时(使用 socket.io 中的偶数断开连接)保存参考当用户返回时,表示该用户正在离线使用时间戳使用时间戳与同一个房间中的其他用户检查是否发送了新消息,如果是,则更新连接用户与新消息
猜你喜欢
  • 2014-12-26
  • 2017-05-05
  • 1970-01-01
  • 2014-11-13
  • 2016-03-13
  • 2017-03-21
  • 2017-03-16
  • 2015-04-18
  • 2015-12-04
相关资源
最近更新 更多