29

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

私が今達成したいのは、接続するクライアントがグループにクラスター化されていることです。したがって、グループAを構成するクライアントと、グループBを構成する他のクライアントが存在する可能性があります。特定のURLをアドレス指定することにより、所属するグループを選択する必要がありlocalhost:3000/Aますlocalhost:3000/B

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

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

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

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

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

更新:@sdedelbrockの回答によると、名前空間または部屋を使用できます。

  • 名前空間を使用する場合、名前空間に関係なく、私は長い間すべての人に送信することができません。これは、io.socketsがへのショートカットio.of('')であり、もちろん名前空間と一致しなくなったためです。
  • これは、部屋を使用する必要があることを意味しますが、部屋と名前空間のセマンティックの違いは何でしょうか。

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

4

2 に答える 2

30

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

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);
}
于 2012-11-22T02:35:51.143 に答える
4

これは、使用できるテンプレートアプリケーションです(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!");
  };
}

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

于 2014-08-04T06:01:40.867 に答える