2017-05-06 19 views
0

我們如何才能發送帖子內容給只有用戶使用socket.io才能參與的人,我閱讀了關於命名空間和房間的信息但是我們是否應該爲每個用戶和他的朋友創建一個名稱空間,以及如何在新帖子可用時監聽特定用戶名稱空間。這是使用socket.io發送帖子到社交網絡中的源的最佳方式

假設x有5個朋友(a,b,c,d,e),當a,b,c,d,e中的任何一個在線/連接時,如何連接到x的命名空間。

+0

無論何時用戶連接到套接字,您都可以將該套接字標識保存到數據庫中。現在,當朋友X做某事時,你知道a,b,c,d,e需要得到通知。所以將通知發送到它們的套接字ID。這將幫助您輕鬆管理。如果您使用房間並且有任何新朋友連接,則需要檢查和更新可能很複雜的房間進行管理。 –

+0

我怎樣才能找到一個套接字ID引用一些特定的用戶? –

回答

1

我不認爲房間可能適合您的需求。你有一個從N到M的人羣網絡,它可以在生活中被修改,而且這個結構對於像房間一樣簡單的事物來說效果不好。

相反,我建議你只是做一些簡單的像這樣,當你想將消息發送到一個特定用戶的所有連接朋友:

  1. 查找源用戶的朋友在你的數據庫。
  2. 通過所有當前連接的套接字(這是socket.io爲您維護的結構)循環,並將每個用戶與該朋友列表進行比較。當您找到匹配的關聯好友時,請向他們發送消息並轉到下一個消息。

然後,當有人連接時,朋友改變或某人上網或離線時,無事可做。當你想發送消息時,你只需查找朋友併發送給任何朋友的連接用戶。


如果你想使用的房間這一點,那麼你可以做這樣的事情:

  1. 當任何人連接,得到他們的好友列表,並在朋友認爲列表中的用戶,加入將用戶連接到一個房間。例如,如果「Bob」連接並且Bob與「Alice」和「Ted」是朋友,則將Bob加入名爲「Alice_friends」和「Ted_friends」的房間。如果鮑勃有100個朋友,你會加入他100個房間(每個朋友一個)。
  2. 然後,當愛麗絲想要給她的朋友發送消息時,她會向「愛麗絲朋友」房間發送消息。
  3. 然後,任何時候連接的用戶添加一個朋友,你必須將他們加入到該朋友的房間。
  4. 然後,任何時候連接的用戶刪除一個朋友,你必須從朋友的房間中刪除他們。

socket.io將自動從它所在的所有房間中刪除一個套接字,只要它們斷開連接,所以您不必自動執行該套接字。


這兩種方案之間存在權衡。第一種方法在您想要向所有朋友發送消息時做了一些工作,但在用戶連接時並沒有額外的工作,並且在運行時不消耗額外的內存。

第二種方案在連接時做了很多工作,每次朋友被添加/刪除並消耗更多的內存,但每次您想要向每個朋友發送消息時速度會更快。無論性能差異還是內存消耗差異顯着或顯着都需要測試,並取決於實施的規模和細節。

+0

我想知道更多關於如何使用名稱空間的信息 –

+0

命名空間是您在套接字第一次連接時連接到的某個東西,並且給定的連接只能位於該初始名稱空間中。我不確定它與這個問題有什麼關係。 – jfriend00

+0

我的意思是說,如果我爲a,b,c,d創建一個名稱空間並將其存儲在數據庫中,以及何時必須將他的帖子發送給c,d我只需檢索c,d命名空間並將它們套接字。 –