2012-06-07 199 views
121

我正在調查nodejs/socket.io進行實時聊天,我需要一些實現聊天室的建議。socket.io房間或命名空間?

哪個更好,使用命名空間或使用房間功能來完全隔離聊天者的對話?

房間和命名空間的真正技術區別是什麼?

是否有任何資源使用差異?

回答

165

這是命名空間和客房都共同(socket.io v0.9.8 - 請注意涉及一個完全重寫的是1.0版,這樣的事情可能會改變):

  • 兩個命名空間(io.of('/nsp')),客房(socket.join('room')都在服務器端
  • 多個命名空間和多個房間共享相同的(網頁套接字)連接
  • 012創建
  • 服務器將僅通過線路傳輸消息到連接到/加入nsp /房間的那些客戶端,即它不只是客戶端過濾

差異

  • 命名空間是通過使用io.connect(urlAndNsp)客戶連接(客戶端將被添加到該命名空間,只有當它已經存在於服務器)
  • 房間只能在服務器端連接(儘管在服務器端創建API以使客戶端可以直接連接)
  • 命名空間可以authorization protected
  • 授權不可用的房間,但自定義授權可以被添加到上述情況,容易在服務器上創建API,如果一個是使用客房
  • 彎曲
  • 房間是一個命名空間(默認爲「全球性」的命名空間)的一部分
  • 命名空間始終紮根於全球範圍內

爲了不混淆的名稱(室或命名空間)的概念,我將使用車廂提及的概念,而其他兩個名稱實現這一概念的。所以,如果你

  • 需要每個隔間授權,命名空間可能是最簡單的途徑採取
  • 如果你想分級分層的隔間(2層最大),使用命名空間/房間組合
  • 如果您的客戶端應用程序由不同的部分組成(它們本身不關心隔離區,但是)需要相互分離,請使用命名空間。

後者的一個例子是,在不同的模塊,也許單獨開發(例如第三方)一個大的客戶端應用程序,各自獨立地使用socket.io在相同的應用程序正在使用,並希望共享一個單一網絡連接。

實際上沒有對此進行基準測試,在我看來,如果您只需在項目中使用簡單的隔離區來分隔和分組消息,則任何一個都可以。

不知道這是否會回答你的問題,但引導這個答案的研究至少幫助我看清了。

+3

在socket.io版本> = 1.0之後,有沒有什麼重大變化? – Xeroxoid

+1

最後一個版本的變化,閱讀http://socket.io/docs/rooms-and-namespaces/和這個答案可以有助於瞭解房間的東西 http://stackoverflow.com/questions/24041220/sending-message -to-a-specific-id-in-socket-io-1-0/24224146#24224146 –

+1

我們可以說名稱空間是我的web應用程序的某個區域,並且是該區域中的一組客戶端? – Onaiggac

9

這取決於你想要做什麼。

主要區別在於房間難以實施。 您必須爲每個頁面重新加載時創建一個加入房間的方法。

隨着命名空間,你只需要在你的JavaScript客戶端和客戶端在命名空間自動添加到寫var example = io.connect('http://localhost/example');。利用

例子:

  • 室:私人聊天。
  • 命名空間:頁面的聊天。
43

這是一個古老的問題,但經過對這個話題的一些研究後,我發現接受的答案在重要的一點上並不清楚。根據Guillermo Rauch本人(see link): 雖然理論上可以在運行的應用程序上動態地創建名稱空間,但您主要將它們用作應用程序的預定義單獨部分。另一方面,如果您需要即時創建專用隔間以適應用戶羣/連接羣,則最好使用房間。

相關問題