Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Google App Engine和Socket.IO上的移动聊天应用程序_Ios_Node.js_Sockets_Socket.io_Chat - Fatal编程技术网

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

Ios Google App Engine和Socket.IO上的移动聊天应用程序,ios,node.js,sockets,socket.io,chat,Ios,Node.js,Sockets,Socket.io,Chat,我正在用Node.JS的Socket.IO创建一个聊天应用程序,有几件事我需要澄清 我正在我的应用程序中实现离线消息传递,这意味着当用户打开应用程序时,他将收到在线时错过的所有消息 这是我的方法: 1) 客户端打开应用程序并订阅/加入房间 2) 客户端向Socket.IO发送消息 3) Socket.IO将消息插入某种数据库/数据存储中 4) 当客户端尝试检索消息时,它会从数据库/数据存储中提取并保存在用户手机上,然后从数据库中删除 这是正确的方法吗 我在网上查看,一些人建议使用任务/消息队列,

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

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

这是我的方法:

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

这是正确的方法吗


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

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

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

我可以想出两种方法来更优雅地完成这项工作:

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

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

    为什么从我的数据库中删除消息不好@Nadavvadan,因为这样您就不会保存用户的聊天历史记录。这取决于您的用例,但我认为您可能希望将聊天记录保存在数据库中,以便在用户删除数据后,其他设备/同一设备可以访问信息。同样,这并不适用于所有的应用程序,所以我把它看作是最常见的用例。在这种情况下,消息队列可以取代数据库吗。例如,我可以使用RabbitMQ而不是将消息存储在数据库中吗?我明白你所说的聊天历史的意思,这对于应用程序的上下文来说非常具体。感谢您的回复。使用RabbitMQ/ZeroMQ/Redis/其他消息传递队列,即时消息在正确的轨道上是可能的。但是你的申请有必要吗?我不这么认为。尝试一下可能会很有趣,但除非你期待大量的流量,
    websockets
    应该足够了,而且更易于配置,而且还可以在web浏览器中得到支持(因此,理论上,你也可以为你的应用构建一个web应用程序)。我可能会选择WebSocket和DB。