ios - Google App Engine 和 Socket.IO 上的移动聊天应用程序

标签 ios node.js sockets socket.io chat

我正在使用 Node.JS 的 Socket.IO 创建一个聊天应用程序,有几件事我需要澄清。

我正在我的应用程序中实现离线消息传递,这意味着当用户打开该应用程序时,他将收到他在线时错过的所有消息。

这是我的方法:

1) 客户打开应用程序并订阅/加入房间 2)客户端向Socket.IO发送消息 3) Socket.IO 将消息插入某种数据库/数据存储 4) 当客户端尝试检索消息时,它从数据库/数据存储中提取并保存在用户手机上,然后从数据库中删除。

这是正确的方法吗?

我在网上看到一些人建议使用任务/消息队列,例如 Google App Engines Task Queue,但我不确定它是如何工作的。

最佳答案

您的方法听起来不错,但我不会从数据库中删除消息,至少不会在客户端收到消息后立即删除。

从你的问题来看,你目前似乎没有将消息保存到数据库中。 这种方法有一些缺点;例如,用户无法在发送某些消息时未连接的设备上查看他们的聊天记录。

我可以想到两种更优雅的方式:

  1. 将所有消息保存到数据库。在 websocket 连接和重新连接上,获取比最新消息更新的所有消息(此方法假定您的聊天中没有编辑功能,因为不会以这种方式获取编辑)。后者可以使用 HTTPWebSockets 实现。
  2. 如果您不想将消息存储在您的服务器中,那么您应该在用于发送消息的设备中实现某种持久缓存。这与您的原始解决方案非常相似,只是您不是将消息存储在数据库中,而是将它们存储在用户的设备上。这确实需要一些逻辑来检测何时收到消息,以及何时收件人重新连接,以便触发发送丢失的消息。

在我看来,第一种方法对于一般用例要好得多,但这取决于您的用例。

关于ios - Google App Engine 和 Socket.IO 上的移动聊天应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45803353/

相关文章:

java - 为什么不重新评估 while 条件?

ios - arm64上的微信SDK

node.js - 更新到 Angular 8 CLI 后抛出 ".getColorDepth is not a function"

ios - UISlider 平滑改变值

node.js - 在Dockerfile中进行npm构建时不会生成'dist'文件夹

node.js - Firebase 数据库AuthVariableOverride 不起作用

c++ - pthread 和 socket.h 的可移植性

python - 如何处理线程模块中引发的 KeyboardException?

ios - 不断询问 iTunes Sandbox 帐户凭据

ios - AVPlayerItemVideoOutput copyPixelBufferForItemTime针对特定视频在iOS上给出了不正确的CVPixelBufferRef