web-dev-qa-db-ja.com

Socket.IO 1.0の特定のIDにメッセージを送信する

特定の1つのソケットIDにデータを送信したい。

以前のバージョンでは、これを行うことができました。

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Socket.IO 1.0で同様のことを行うにはどうすればよいですか?

79
user2283026

Socket.io 1.0では、このためのより良い方法を提供します。各ソケットは、セルフIDによってデフォルトルームに自動的に参加します。ドキュメントの確認: http://socket.io/docs/rooms-and-namespaces/#default-room

したがって、次のコードを使用してidでソケットに発行できます。

io.to(socketid).emit('message', 'for your eyes only');
197

Socket.io 1.0では、次のコードでそれを行うことができます。

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

更新:

@MustafaDokumacıの答えには、より良い解決策が含まれています。

92
Oleg

@MustafaDokumacıと@Curiousはすでに十分な情報を提供しているので、ソケットIDを取得する方法を追加しています。

ソケットIDを取得するには、socket.idを使用します。

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
16
Dhiral Pandya

名前空間を使用している場合、次のように動作することがわかりました。

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

名前空間の詳細: http://socket.io/docs/rooms-and-namespaces/

6
Meth

@Curiousと@MustafaDokumacıの両方がうまく機能するソリューションを提供したと思います。違いは、@MustafaDokumacıのソリューションでは、メッセージが特定のクライアントだけでなくルームにブロードキャストされることです。

違いは、確認が要求されたときに顕著になります。

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

期待どおりに動作しますが、

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

失敗する

Error: Callbacks are not supported when broadcasting
5
Giannis Kosmas

node.jsで-> socket.io->ダウンロードするチャットの例があります。これをインラインで貼り付けます(接続時にio)。

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
1
user2204339