2017-08-28 654 views
0

我正在尝试使用socket.io创建移动聊天应用程序。我打算将邮件存储在用户手机上的本地数据库中,这样我就不必对我的数据库执行http请求来检索旧邮件。我的聊天应用程序由多达12人的房间组成。Socket.io离线消息

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

+0

您将不得不依赖socket.io来跟踪房间,因为当用户下线时,它将删除来自房间的用户。相反,一个房间必须保存在数据库中,当用户上线时,您可以在数据库中查找它们并将它们加入到它们应该在的任何socket.io房间中。同样,当您发送消息到一个房间,你必须在数据库中查找房间,并将消息添加到数据库中该用户的消息队列(如果他们当前不在线)。 – jfriend00

回答

0

一种方法是将消息保存到数据库中并在用户连接到房间时获取它(我有一个聊天应用程序,我们将这些信息保存到mongodb中,并根据房间ID检索它) 。 套接字io不会持有任何消息,因此每次用户连接到一个房间时,您都应该查询数据库并获取所有新消息。由于你有移动设备中所有消息的数据库,所以使用消息的日期来获取所有新消息。

或者

可以保存用户的VS,当用户连接断开,你只是有一个参考说这句话的用户谁连接到这个房间进入脱机状态,具有一定的时间戳房参考。当用户返回时使用时间戳从其他客户端获取消息并向他发送这些消息

+0

问题是我无法通过房间ID保存我的消息,因为我只想检索一次,所以我在每个消息的数据库中另存一行,以便用户检索消息时将其从数据库中删除并添加到我在用户手机上的本地数据库 –

+0

我在想的是,当用户连接到房间时,他提供了房间/群聊中(在线和离线)的所有人阵列,并且当发送消息时,从数组中接收到消息,并在数据库中为数组中的其他用户保存一条记录,该记录只有不在线的用户 –

+0

这不会使事情变得复杂。正如你所说,检索后删除的消息,然后在房间里有一个副本只是使用该副本分发给所有离线的人 我不知道你的业务场景,但我只是说会发生什么所有用户收到的消息,如果用户卸载并重新安装您的应用程序的一些和他的本地数据库被清除 –