web-dev-qa-db-ja.com

Socket.io:名前空間、チャネル、co

Socket.io を使用して作成されたソケットサーバーを実行するNode.js Webサーバーがあります。基本的に、これは機能します。

現在達成したいのは、接続するクライアントがグループにクラスター化されていることです。したがって、グループAを構成するクライアントとグループBを構成する他のクライアントが存在する可能性があります。これらのクライアントは、特定のURL(_localhost:3000/A_または_localhost:3000/B_)を指定して、所属するグループを選択します。

Socket.ioでは、グループを確認せずに、グループAのすべてのクライアント、グループBのすべてのクライアント、またはすべてのクライアントにメッセージを送信したいと思います。

これは基本的にはルームとチャットするようなもので、特定のルーム内のすべてのクライアント、またはどのルームにいるかに関係なく、すべてのクライアントにメッセージを送信できます。

Socket.ioを使用してこのようなシステムを設計する最良の方法は何ですか?

これまでは、基本的にグループAとBを作成するために機能する名前空間を使用してきましたが、どの部屋にいても、すべてのクライアントにメッセージを送信できなくなります。少なくとも、方法はわかりませんこの。

これをどのようにモデル化すればよいですか?私が探すべき正しい用語は何ですか?

UPDATE:@ sdedelbrock の回答によると、名前空間またはルームを使用できます:

  • 名前空間を使用している場合、名前空間に関係なく、誰にでも送信できなくなります。これは、_io.sockets_がio.of('')へのショートカットであり、当然のことながら名前空間と一致しなくなったためです。
  • これは、部屋を使用する必要があることを意味しますが、部屋と名前空間の意味上の違いは何なのでしょうか。

簡単に言うと、なぜ同じ(?)アイデアに2つの概念があるのですか?

29
Golo Roden

部屋を使用している可能性があるため、次のようにして、部屋の全員に放出します。

io.sockets.in('a').emit('inA', 'foo')

次に、使用できるすべての人に放出するには

io.sockets.emit('everyone','bar');

名前空間も使用できます。

io.of('/b').emit('inB', 'buzz');

トリガーしたユーザー以外の全員に送信するには、次のようにします。

io.sockets.broadcast.emit("hello");

[編集]これがより詳細な回答です:

名前空間の背後にある考え方は、他の名前空間とは別に(グローバルであっても)処理されるということです。まったく新しいsocket.ioインスタンスのように考えると、異なる名前空間が互いに干渉し合うことなく、新しいハンドシェイク、新しいイベント、承認などを実行できます。

これは/chatおよび/tracking接続イベントのロジックが非常に異なる場合

Socket.ioは、2つの別個のインスタンスであるかのようにすべての作業を行いますが、情報を1つの接続に制限するので、かなりスマートです。

すべての名前空間にブロードキャストできる回避策があるかもしれません(以下の例)。ただし、要するにこれを行うべきではなく、部屋を使用する必要があります。

for (var nameSpace in io.sockets.manager.namespaces){
  io.of(nameSpace).emit("messageToAll", message);
}
30
Sdedelbrock

これは使用できるテンプレートアプリケーションです(9.16で動作します。1.xではテストされていませんが、動作するはずです)。

var namespaces = [
    io.of('/ns1'),
    io.of('/ns2'),
    io.of('/ns3')
];

for (i in namespaces) {
    namespaces[i].on('connection',handleConnection(namespaces[i]));  
}

function handleConnection(ns) {
   return function (socket){ //connection
   console.log("connected ");
   socket.on('setUsername',setUsernameCallback(socket,ns));                       
   socket.on('disconnect', disconnectCallback(socket,ns));                        
   socket.on('messageChat',messageChatCallback(socket,ns));
   socket.on('createJoinRoom',createJoinRoomCallback(socket,ns));  

  };
}

function disconnectCallback(socket,ns) {
    return function(msg){
    console.log("Disconnected ");
    socket.broadcast.send("It works!");
  };
}

あなたは自分で他のハンドルを書くことができます:)

4
Marwen Trabelsi