2012-11-22 6 views
28

Socket.ioを使用して作成された上にソケットサーバーを実行するNode.js Webサーバーがあります。基本的に、これは動作します。Socket.io:名前空間、チャネル、および共同

ここで達成したいのは、接続するクライアントがグループ化されていることです。だから、グループAを構成するクライアントと、グループBを構成する他のクライアントがあるかもしれません。特定のURL(localhost:3000/Aまたはlocalhost:3000/B)をアドレス指定して、グループに属するグループを選択します。

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

それだ基本的に部屋とおしゃべりを持って、あなたは特定の部屋内のすべてのクライアントのいずれかのメッセージを持っている、または任意のクライアントのために、どんな部屋に彼がでていないような。

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

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

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

UPDATE:

  • 使用の名前空間は、私は長い間かかわらず、名前空間の、みんなに送信することはできませんよ場合:私は名前空間または部屋を使用することができ@sdedelbrockの答えによります。これは、io.socketsio.of('')へのショートカットであるためです。もちろん、これはもはや名前空間と一致しません。
  • これは私が部屋を使うべきであることを意味しますが、部屋と名前空間の意味の違いは何か分かりません。

簡潔にする:同じ(?)アイデアには2つの概念があるのはなぜですか?

答えて

29

次はあなたがまたとして名前空間を使用することができます

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

を使用することができますみんなに発光するように続いて部屋

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

でみんなに放出するだろうので、あなたが部屋を使用することができよく:

トリガーしたユーザー以外のすべてのユーザーに送信する場合は、

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

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

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

これは言う/chatと接続イベントが

Socket.ioは、2つの別々のインスタンスであるかのようにあなたのためにすべての作業を行いますが、それでも1に情報を制限非常に異なるロジックを持っているでしょう/trackingのために有用であろう接続はかなりスマートです。

すべてのネームスペース(以下の例)にブロードキャストできる回避策があります。しかし、あなたはこれをやってはいけません。あなたは部屋を使うべきです。

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

私はこれを試しました。 2番目のアプローチ(名前空間)を使用する場合、名前空間にかかわらず、誰にでも長い時間を送ることができません。これは、 'io.sockets'が' io.of( '') 'へのショートカットであるためです。これは、もはや名前空間にはそれ以上一致しません。つまり、私は部屋を使うべきです。 とにかく、部屋と名前空間の意味の違いは何ですか?同じ(?)アイデアのために2つの概念があるのはなぜですか? –

+1

私はそれが別々に管理できると信じています。[Socket.io Namespaces](http://gordonkoo.com/blog/2012/02/28/under-thehood -of-socket-io-namespaces /) – Sdedelbrock

+0

この記事は間違いなく良い読書ですが、残念ながら私の質問には答えません。私はいつでも名前空間を使うべきか、部屋を使うべきか、そしてそれらの意味の違いは何かを理解することができません。さらに、ネームスペースに関係なく、どのようにすべてのクライアントにメッセージを送信するのですか? –

4

これはあなたが使用できるテンプレートアプリケーションです(9.16の作品; 1.1でテストが、それは動作するはずではない):

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!"); 
    }; 
} 

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

関連する問題