Socket.IO 2014/11/11 00:11


This is what namespaces and rooms have in common ( v0.9.8):

  • Both namespaces (io.of('/nsp')) and rooms (socket.join('room')) are created on the server side
  • Multiple namespaces and multiple rooms share the same (WebSocket) connection
  • The server will transmit messages over the wire only to those clients that connected to / joined a nsp / room, i.e. it's not just client-side filtering

namespaceとroomの共通点(Socket.IO ver0.9.8)

  • namespaceもroomも、サーバサイドで作成される
  • namespaceやroomが複数あっても、同一のWebSocketが共有される
  • サーバは、クライアントが属するnamespaceやroomのみにメッセージを送信する。つまり、クライアント側のフィルタではない。


The differences:

  • namespaces are connected to by the client using io.connect(urlAndNsp) (the client will be added to that namespace only if it already exists on the server)
  • rooms can be joined only on the server side (although creating an API on the server side to enable clients to join is straightforward)
  • namespaces can be authorization protected
  • authorization is not available with rooms, but custom authorization could be added to the aforementioned, easy-to-create API on the server, in case one is bent on using rooms
  • rooms are part of a namespace (defaulting to the 'global' namespace)
  • namespaces are always rooted in the global scope


  • namespaceは、io.connect(urlAndNsp)によってクライアントから接続される(サーバは、namespaceが存在している場合にだけ、そのnamespaceにクライアントを追加する)
  • roomへの参加ができるのはサーバサイドのみ(クライアントのroom参加を可能にするAPIをサーバサイドに作るのは簡単だけど)
  • authorizationはroomでは利用できないが、roomを使う決心をしたとしても、サーバサイドのカスタム認証APIは簡単に追加できる
  • roomはnamespaceの一部分である(グローバルなnamespaceに初期設定されている)
  • namespaceは常にグローバルスコープに属している

訳注:Socket.IO 1.0で、authorizationはmiddlewareという仕組みに置き換えられましたが、roomで利用できないことには変わりないようです。

To not confuse the concept with the name (room or namespace), I'll use compartment to refer to the concept, and the other two names for the implementations of the concept. So if you

  • need per-compartment authorization, namespaces might be the easiest route to take
  • if you want hierarchically layered compartments (2 layers max), use a namespace/room combo
  • if your client-side app consists of different parts that (do not themselves care about compartments but) need to be separated from each other, use namespaces.


  • 区画毎の認証が必要な場合、namespaceが一番近道
  • (最大2層の)階層構造の区画が必要な場合は、namespace/roomを組み合わせる
  • クライアントサイドアプリが、分離の必要な異なるパーツ(自身で区画の面倒を見ない)から成り立っている場合、namespaceを使う

An example for the latter would be a large client app where different modules, perhaps developed separately (e.g. third-party), each using independently, are being used in the same app and want to share a single network connection.



Not having actually benchmarked this, it seems to me if you just need simple compartments in your project to separate and group messages, either one is fine.




  • チャット機能 = namespace A
    • チャットルーム1 = room A1
    • チャットルーム2 = room A2
  • ニュース機能 = namespace B
    • ニュースカテゴリ1 = room B1
    • ニュースカテゴリ2 = room B2
  • ダイレクトメッセージ機能 = namespace C
    • EさんとFさんのDM = room C1
    • MさんとNさんのDM = room C2




Socket.IO 2014/11/11 00:11
comments (0)

blog-java2 engine (build:2019-02-23 17:57 JST)