部屋の目的は何だろうと思っていました。参照: https://socket.io/docs/rooms-and-namespaces/
基本的に、_socket.on
_と_socket.off
_だけでjoin
とleave
を模倣できます
例えば:
(部屋がない)
クライアント:
_socket.on('chat', (data) => {
console.log("chat received", data)
$(this.$refs.chatBox).append(`
<div>
${data}
</div>
`)
})
_
サーバ:
_socket.on('chat', function (id, msg) {
console.log("id:", id, 'message:', msg)
socket.broadcast.emit('chat', msg);
// io.emit('chat', msg)
})
_
これは_"chat"
_をリッスンし、socket.off("chat")
を使用してオフにすることができます
今私は似たようなことをしますが、部屋があります:
クライアント:
_// to join
socket.emit('waiting room', socket.id)
// to message
socket.emit('waiting room chat', { msg: this.$refs.waiting_input.value })
_
サーバ:
_socket.on('waiting room', function (id) {
console.log("socket has joined the waiting room", id);
socket.join("waiting room")
})
socket.on("waiting room chat", function(payload) {
console.log("waiting room chat:", payload.msg)
// io.to("waiting room").emit('waiting room', payload.msg)
socket.broadcast.to("waiting room").emit('waiting room', payload.msg)
})
_
ここで、_waiting room chat
_にメッセージを送信しても、ソケットがルームに参加していない場合、ソケットは受信されません。しかし、2番目の方法には最初の方法よりもどのような利点がありますか?
ルームは、接続されたユーザーのグループを追跡するためのsocket.ioサーバーのツールです。その後、部屋のソケットを反復したり、すべてのソケットにブロードキャストしたりできます。彼らにとってそれ以上のものは何もありません。サーバーは、部屋にソケットを配置したり、部屋からソケットを削除したりできます。ソケットの接続が解除されると、ソケットはすべての部屋から自動的に削除されます。
各ソケットは、socket.id
から名前が構成される部屋にも自動的に配置されます。これにより、socket.ioは、IDしか持っていない場合でも、任意のソケットに送信できます。
メッセージのみを使用し、各クライアントにどのメッセージをリッスンさせるかを決定するためのスキームは、サーバー駆動のスキームとは対照的に、クライアント駆動のスキーム(クライアントが注意を払うべきメッセージを決定)であり、おそらく同じようにスケーリングしません。すべてのクライアントがすべてのメッセージを聞くことができるように、すべてのメッセージをすべてのクライアントに送信する必要があるためです。一方、ルームはサーバー主導のスキームであり、サーバーはどのソケットがどのグループにあるかを(事前に)追跡し、それらのメッセージを取得する必要があるクライアントにのみメッセージを送信します。サーバーは、物事を制御すると同時に、より効率的に実行します。
さらに、場合によっては、何を聞くことができるかをクライアントに任せることはできません。プライベートな1対1のチャットセッションをセットアップするチャットサーバーがあるとします。その場合、clientAが他のチャットセッションのチャットメッセージをリッスンすることを許可される状況はありません。それを実施するために、サーバーはペアワイズの参加者にチャットメッセージのみを送信する必要があります。これは、部屋には非常に役立つ機能ですが、スキームには役立ちません。
部屋は論理的なグループ構成であり、WebSocketを使用する開発者にとって、箱から出してすぐに使用できる多くの利点があります。
ルームを使用すると、各クライアントの個々のソケットIDを参照することなく、特定のクライアントセットへのブロードキャストが容易になります。
クライアントは、接続を維持したまま、部屋の中にいてもいなくてもかまいません。したがって、部屋は、サーバーによってブロードキャストされるイベントトピック/チャンネルへの論理的な「サブスクリプション」を提供します。
一部の部屋は保護されている場合や、より高いアクセスレベルが必要な場合もあります。これは、クライアントに資格情報を使用して「参加」リクエストを送信させることでもシミュレートできます。
マルチプレーヤーゲームでは、各ゲームセッションまたはゲームエリア/ゾーンは、部屋と論理的に同等です。
サーバーインスタンスのクラスターを実行している場合、部屋(socket.ioブリッジアダプターを使用)は、異なるサーバーインスタンスに接続されているクライアントをグループ化することもできます。