web-dev-qa-db-ja.com

socket.io-名前空間でメッセージをブロードキャストする方法は?

Socket.ioの例によると:

ブロードキャストするには、broadcastフラグをemitおよびsendメソッド呼び出しに追加するだけです。ブロードキャストとは、メッセージを開始するソケット以外の全員にメッセージを送信することです。

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

io.sockets.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

これを新しいsocket.io namsepace機能と組み合わせようとしたので、次のようになりました。

var chat = ioserver.of('/chat');

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.send(msg);
      });
  });

これは問題なく機能し、チャットチャンネルの全員(および他のチャンネルはなし)がメッセージを受け取ります。ただし、送信者も取得します。だから私は次のことをしようとしました:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.broadcast.send(msg);
      });
  });

例外: 'undefinedのメソッド' send 'を呼び出せません。わかりましたので、私は、ブロードキャストは単一のソケットの機能であると考えました(しかし、少し奇妙に感じます-単一のソケットが他のすべてにブロードキャストできる方法...)。だから私は試しました:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.broadcast.send(msg);
      });
  });

しかし、今ではさらにひどく、誰もメッセージを受信せず、送信者さえも受信していません。とにかく、それは私が論理的に期待したものでした-1つのソケットはそれ自体を通して何かをブロードキャストできません。また、今回は例外がないため、ソケットに対してブロードキャストが定義されています。

私が行った場合:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.send(msg);
      });
  });

元の送信者のみがメッセージを取得しますが、これもかなり論理的です-クライアント関連のソケットの「送信」を使用しました。

質問は、ブロードキャスト機能を使用する正しい方法は何ですか?

たぶんsocket.ioの開発者は間違いを犯して間違ったオブジェクトにブロードキャスト機能を追加しました(私が理解しているように、それは名前空間の機能であるはずですが、現在はソケットに対してのみ定義されています)?

48
JustAMartin

バウンティを開いた後、自分でこれを解決できたようです。ごめんなさい.

とにかく、これが役立つかどうかを確認してください:

chat.on('connection', function (socket) {
  socket.on('message', function (msg) {
    socket.emit(msg); // Send message to sender
    socket.broadcast.emit(msg); // Send message to everyone BUT sender
  });
});

ただし、送信者に帯域幅を再送信しないと、帯域幅を節約し、ユーザーにとってよりきびきびしたエクスペリエンスを作成できます。メッセージをチャットログに直接追加し、必要に応じて自己送信のみを使用して、問題なく受信されたことを確認します。

70
Michael

クライアントからのメッセージが他のすべてへの応答をトリガーするイベント環境で作業している場合、ソリューションは機能しますが、サーバーからすべてのクライアントにメッセージを送信する場合は機能しません。

_io.sockets.emit_を使用してこれを行うことができます:

_var io = require('socket.io').listen(80);
io.sockets.emit('message', { message: "Hello everyone!" });
_

ただし、特定の名前空間に対してこれを行う方法についてのドキュメントは明確ではありません。 _io.sockets_はio.of('')の単なるショートカットです。そのため、io.of('/namespace').emitを呼び出すことで、名前空間の全員にブロードキャストできます。

_var io = require('socket.io').listen(80);
io.of('/admins').emit('message', { message: "Hello admins!" });
_
36
Luca Spiller
var customNS = ioserver.of('/chat'); 

customNS.on('connection', function (socket) {
   socket.on('message', function (msg) {

       // Send message to sender 
       socket.emit(msg);

       // Send message to everyone on customNS INCLUDING sender
       customNS.emit(msg);

       // Send message to everyone on customNS BUT sender
       socket.broadcast.emit(msg);

       // Send message to everyone on ROOM chanel of customNS INCLUDING sender
       customNS.in('ROOM').emit(msg); 

       // Send message to everyone on ROOM chanel of customNS BUT sender
       socket.broadcast.in('ROOM').emit(msg); 


   });
});

この回答も確認してください 送信者(Socket.io)を除くすべてのクライアントに応答を送信

28
smbeiragh

たぶんこれは誰かを助けるでしょう

socket.broadcast.to('room1').emit('updatechat', 'SERVER', username + ' has connected to this room'); 

見る

NodejsおよびSocketioマルチルームチャットチュートリアル

14
Shimon Doodkin