私は部屋があなたの望むようにうまくいくとは思わない。ライブ中に修正が可能なN対Mのネットワークがあり、その構造は部屋のような単純なものではうまく機能しません。
代わりに、私はあなたがある特定のユーザーの接続されているすべての友人にメッセージを送りたいときは、ちょうどこのような単純な何かをすることをお勧めしたい:
- は、あなたの中に元のユーザの友人を検索しますデータベース。
- 現在接続されているすべてのソケット(これはsocket.ioがあなたのために保持する構造体)を循環し、各ユーザーをその友達のリストと比較します。マッチした友だちを見つけたら、メッセージを送信して次の友達に移動します。
友人が変わったときや誰かがオンラインまたはオフラインになったときに誰かが接続するときは、何もしません。メッセージを送信したいときは、友だちを検索し、友人である接続されたユーザーに送信します。誰が接続すると
- は、友人の彼らのリストを取得し、友人のそのリスト内の各ユーザのために、参加する:あなたは、このために部屋を使用したい場合は
は、その後、あなたはこのような何かを行うことができますユーザを部屋に接続する。たとえば、「Bob」が接続していてBobが「Alice」と「Ted」の友人である場合、Bobを「Alice_friends」と「Ted_friends」という名前の部屋に参加させます。ボブが100人の友人を抱えていたら、彼は100人の部屋に(彼は友達ごとに1人ずつ)参加します。
- その後、アリスが友人にメッセージを送信したいとき、彼女は "Alice_friends"ルームにメッセージをブロードキャストします。
- その後、接続されたユーザーが友人を追加するたびに、その友だちの部屋に参加する必要があります。
- その後、接続されたユーザーが友人を削除すると、その友人の部屋から削除する必要があります。
socket.ioは、切断されたときに自動的にソケットをすべての部屋から削除するので、自動的に行う必要はありません。
これら2つのスキームの間にはトレードオフがあります。最初は、すべての友人にメッセージを送信したいときにもう少し作業をしますが、ユーザーが接続して実行時に余分なメモリを消費しても、余分な作業はありません。
2つ目のスキームは、接続時に友人が追加/削除され、より多くのメモリを消費するたびに多くの作業を行いますが、各友人にメッセージを送信するたびに高速になることがあります。性能差またはメモリ消費差が顕著であるか重要であるかどうかはテストを必要とし、実装の規模および詳細に依存する。
ユーザーがソケットに接続するたびに、そのソケットIDをデータベースに保存できます。今、友人Xが何かをするとき、通知を得るために、あなたはa、b、c、d、eを知っています。それで、ソケットIDに通知を出してください。これは簡単にこれを管理するのに役立ちます。部屋を使用し、新しい友達が接続されている場合は、管理するのが複雑な部屋を確認して更新する必要があります。 –
ソケットIDが特定のユーザーを参照していることを知りたいのですが? –