2017-08-28 119 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

這不會使事情變得複雜。正如你所說,檢索後刪除的消息,然後在房間裏有一個副本只是使用該副本分發給所有離線的人 我不知道你的業務場景,但我只是說會發生什麼所有用戶收到的消息,如果用戶卸載並重新安裝您的應用程序的一些和他的本地數據庫被清除 –