2012-02-21 9 views
0

私は、ユーザーに固有のメッセージをプッシュしたいが、開かれている各タブとそのメッセージのみに行く可能性があるパーソナルWebアプリケーションを開発しています1つのタブ。特定のユーザーのすべてのオープンソケットにメッセージを送信する

私が行ったことは、各ソケットオブジェクトに一意の識別子を付けることです。特定のユーザーにメッセージを送信できますが、最後に開いたタブにのみ移動します。ソケットが両方のタブを参照していることがわかります。私が見るものから

{ id: '6121808001146368876', 
    namespace: 
    { manager: 
     { server: [Object], 
     namespaces: [Object], 
     sockets: [Circular], 
     _events: [Object], 
     settings: [Object], 
     handshaken: [Object], 
     connected: [Object], 
     open: [Object], 
     closed: {}, 
     rooms: [Object], 
     roomClients: [Object], 
     oldListeners: [Object], 
     flashPolicyServer: [Object], 
     gc: [Object] }, 
    name: '', 
    sockets: 
     { '8072595141256968141': [Object], 
     '6121808001146368876': [Circular] }, 
    auth: false, 
    flags: { endpoint: '', exceptions: [] }, 
    _events: { connection: [Function] } } 

下記参照、私はnamespace.sockets下の参照を持っていますが、私が述べたように、これまでの円形1がメッセージを取得するだけです。

どうすれば特定のソケットにフィルタをかけることができますか、それとも名前空間を作成して行う必要がありますか?

また、単なるオブジェクトであり、円形のソケットの重要性は何ですか?私が見ることができるものから、メインのIDは円形のものと同じであり、円形のものは最後のものです。

+1

「循環型」とは、何らかの形で自己参照型であることを意味します。あなたのケースでは、idが一致するので、私はそれを 'yourObj.namespace.sockets.6121808001146368876 === yourObj'と推測しています。あなたの問題に関しては、socket.ioのチャンネルを活用し、各ユーザーに自分のチャンネルを持たせることをお勧めします。そうすれば、自分でジャグリングするソケットを管理する必要はなく、代わりに 'sockets.of(userChannel).emit(...)'を使うことができます。 –

答えて

1

解決策は簡単で、いくつかのアプローチがあります。

メンテナンスされた構造のユーザのためのすべてのソケットへのポインタを格納するのがより複雑なので、指定されたユーザの場合は配列またはソケットまたはsocket.idを取得し、追加して削除する必要があります実際には参照は手動ではありませんが(実際には私のプロジェクトの1つでこのようにしていますが)、実際には推奨されません。

2番目の方法は、Socket.IOにすべてを一元管理することが容易になります。 まず、各ユーザーに一意のIDが必要(私は彼らが持っている賭けるだろう!)と、ユーザーが接続したとき、あなたはユーザーIDからの名前の組み合わせで部屋に彼を参加します。クライアントの切断で

socket.join('UserRoom' + userId); 

、あなたは彼の部屋から彼を削除します。

socket.leave('UserRoom' + userId); 

だけでそれを放出し、指定した1人のユーザから開いているすべてのユーザータブにメッセージをブロードキャストするには:

socket.broadcast.to('UserRoom' + userId).emit('my fancy message'); 

...か...

io.sockets.in('UserRoom' + userId).emit('my fancy message'); 

接続/切断時に1行を追加するだけで、ライブラリはそれをすべて管理する必要があります。

関連する問題