Socket.ioルームのbroadcast.toとsockets.inの違い


102

Socket.ioのreadmeには、次の例が含まれています。

    var io = require('socket.io').listen(80);

    io.sockets.on('connection', function (socket) {
      socket.join('justin bieber fans');
      socket.broadcast.to('justin bieber fans').emit('new fan');
      io.sockets.in('rammstein fans').emit('new non-fan');
    });

違いは何だsocket.broadcast.to()とはio.sockets.in()


14
サンプルデータへの
賛成投票

回答:


122

socket.broadcast.to指定されたルームのすべてのソケットにブロードキャストしますが、指定されたルームのすべてのソケットにブロードキャストしている間は、それが呼び出されたソケットを除きますio.sockets.in


1
チャンネルは部屋とどう違うのですか?
vsync

6
なし。同じものの別の名前。
mike_hornbeck 2013年

socket.ioは、チャネルではなく、部屋という用語を使用します。ただし、rooms / channelsは、socket.ioの名前空間と混同しないでください。正しい用語を使用するように回答を更新しました。
Daniel Baulig 2013年

40

Node.jsは私がしばらく興味を持っていたものであり、私のプロジェクトの1つでそれを使用してマルチプレイヤーゲームを作成しました。

io.sockets.in().emit()そしてsocket.broadcast.to().emit()私たちはSocket.ioの部屋で使うメイン2 EMIT法です(https://github.com/LearnBoost/socket.io/wiki/Rooms)部屋には、接続されたクライアントの簡単な分割を可能にします。これにより、接続されたクライアントリストのサブセットを使用してイベントを発行でき、それらを管理する簡単な方法が提供されます。

これにより、接続されたクライアントリスト(ルームと呼びます)のサブセットを管理し、主要なsocket.io関数io.sockets.emit()やのような同様の機能を利用できsocket.broadcast.emit()ます。

とにかく、私は説明するためにコメント付きのサンプルコードを与えるようにします。それが役立つかどうかを確認してください。

Socket.ioルーム

i)io.sockets.in()。emit();

/* Send message to the room1. It broadcasts the data to all 
   the socket clients which are connected to the room1 */

io.sockets.in('room1').emit('function', {foo:bar});

ii)socket.broadcast.to()。emit();

io.sockets.on('connection', function (socket) {
    socket.on('function', function(data){

        /* Broadcast to room1 except the sender. In other word, 
            It broadcast all the socket clients which are connected 
            to the room1 except the sender */
        socket.broadcast.to('room1').emit('function', {foo:bar});

    }
}

Socket.io

i)io.sockets.emit();

/* Send message to all. It broadcasts the data to all 
   the socket clients which are connected to the server; */

io.sockets.emit('function', {foo:bar});

ii)socket.broadcast.emit();

io.sockets.on('connection', function (socket) {
    socket.on('function', function(data){

        // Broadcast to all the socket clients except the sender
        socket.broadcast.emit('function', {foo:bar}); 

    }
}

乾杯


35

Update 2019:socket.ioは、websocketを使用してhttpリクエストのポーリングにフォールバックする特別なモジュールです。Webソケットのみの場合:クライアントの場合はネイティブWebソケットを使用し、Node.jsの場合はwsまたはこのライブラリを使用します。

簡単な例

構文はsocketioで混乱しています。また、すべてのソケットは自動的にID socket.idを使用して自分の部屋に接続されます(これは、socketioでプライベートチャットが機能する方法であり、部屋を使用します)。

送信者に送信し、他には誰も送信しない

socket.emit('hello', msg);

送信者を含むすべての人に送信者(送信者が部屋にいる場合)の部屋「私の部屋」

io.to('my room').emit('hello', msg);

部屋「私の部屋」の送信者以外の全員に送信する(送信者が部屋にいる場合)

socket.broadcast.to('my room').emit('hello', msg);

全員に送るすべての部屋などの送信者

io.emit('hello', msg); // short version

io.sockets.emit('hello', msg);

特定のソケットにのみ送信(プライベートチャット)

socket.broadcast.to(otherSocket.id).emit('hello', msg);

otherSocket.idを見つける方法。どこに設定しますか?
Iman Marashi

@ImanMarashi必要なのは、他のソケットオブジェクトを取得して、そのidプロパティにアクセスすることだけです。 otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K-SOの毒性が高まっています。

驚くばかり !io.to( '私の部屋').emit( 'hello'、msg); その助けてくれ:)
iamkdblue

@ImanMarashiは、otherSocket.idを外部の配列またはオブジェクトに保存します。呼び出されたソケットから後でアクセスします。
K-SOの毒性が高まっています。

2
io.on('connect', onConnect);

function onConnect(socket){

  // sending to the client
  socket.emit('hello', 'can you hear me?', 1, 2, 'abc');

  // sending to all clients except sender
  socket.broadcast.emit('broadcast', 'hello friends!');

  // sending to all clients in 'game' room except sender
  socket.to('game').emit('nice game', "let's play a game");

  // sending to all clients in 'game1' and/or in 'game2' room, except sender
  socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");

  // sending to all clients in 'game' room, including sender
  io.in('game').emit('big-announcement', 'the game will start soon');

  // sending to all clients in namespace 'myNamespace', including sender
  io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon');

  // sending to a specific room in a specific namespace, including sender
  io.of('myNamespace').to('room').emit('event', 'message');

  // sending to individual socketid (private message)
  io.to(`${socketId}`).emit('hey', 'I just met you');

  // WARNING: `socket.to(socket.id).emit()` will NOT work, as it will send to everyone in the room
  // named `socket.id` but the sender. Please use the classic `socket.emit()` instead.

  // sending with acknowledgement
  socket.emit('question', 'do you think so?', function (answer) {});

  // sending without compression
  socket.compress(false).emit('uncompressed', "that's rough");

  // sending a message that might be dropped if the client is not ready to receive messages
  socket.volatile.emit('maybe', 'do you really need it?');

  // specifying whether the data to send has binary data
  socket.binary(false).emit('what', 'I have no binaries!');

  // sending to all clients on this node (when using multiple nodes)
  io.local.emit('hi', 'my lovely babies');

  // sending to all connected clients
  io.emit('an event sent to all connected clients');

};

コードに付随する説明を提供できますか?一般に、コードを提供するだけでは眉をひそめます。しかし、あなたのコードはよくコメントされていることがわかります:)
MBorg

1

Socket.IO 1.0では、.to()と.in()は同じです。そして、部屋の他の人はメッセージを受け取ります。クライアントが送信しても、メッセージは受信されません。

ソースコード(v1.0.6)を確認してください。

https://github.com/Automattic/socket.io/blob/a40068b5f328fe50a2cd1e54c681be792d89a595/lib/socket.js#L173


.to(),inは同じなので、ソケットのIDとまったく同じ名前の部屋を作成するとどうなりますか。socket.broadcast.to(socketid)次に、たとえば何をしますか?
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.