web-dev-qa-db-ja.com

socket.ioを使用して特定のクライアントにメッセージを送信する方法

私はsocket.io + node.jsから始めています。メッセージをローカルに送信し、socket.broadcast.emit()関数をブロードキャストする方法を知っています。接続されているすべてのクライアントが同じメッセージを受信します。

今、私は特定のクライアントにプライベートメッセージを送信する方法を知りたいです、私は2人の間のプライベートチャットのための1つのソケットを意味します(クライアントからクライアントへのストリーム)。ありがとう。

80
Nizar B.

ユーザーが接続するとき、サーバーは、電子メールのように一意でなければならないユーザー名でメッセージを送信する必要があります。

ユーザー名とソケットのペアは、次のようなオブジェクトに保存する必要があります。

var users = {
    'us[email protected]': [socket object],
    '[email protected]': [socket object],
    '[email protected]': [socket object]
}

クライアントで、次のデータとともにオブジェクトをサーバーに送信します。

{
    to:[the other receiver's username as a string],
    from:[the person who sent the message as string],
    message:[the message to be sent as string]
}

サーバーで、メッセージをリッスンします。メッセージを受信したら、データを受信者に送信します。

users[data.to].emit('receivedMessage', data)

クライアントでは、「receivedMessage」と呼ばれるサーバーからの送信をリッスンし、データを読み取ることで、送信者と送信されたメッセージを処理できます。

88
Adam

Socket.ioルームを使用できます。クライアント側から、一意の識別子(email、id)を使用してイベント(この場合は「join」、何でもかまいません)を発行します。

クライアント側:

var socket = io.connect('http://localhost');
socket.emit('join', {email: [email protected]});

さて、サーバー側からその情報を使用して、そのユーザーに固有の部屋を作成します

サーバ側:

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

io.sockets.on('connection', function (socket) {
  socket.on('join', function (data) {
    socket.join(data.email); // We are using room of socket io
  });
});

そのため、今ではすべてのユーザーがユーザーのメールにちなんで名付けられた部屋に参加しています。したがって、特定のユーザーにメッセージを送信する場合は、

サーバ側:

io.sockets.in('[email protected]').emit('new_msg', {msg: 'hello'});

クライアント側で最後にやることは、「new_msg」イベントをリッスンすることです。

クライアント側:

socket.on("new_msg", function(data) {
    alert(data.msg);
}

私はあなたがアイデアを得ると思います。

230
az7ar

SURE:単純に、

これはあなたが必要とするものです:

io.to(socket.id).emit("event", data);

ユーザーがサーバーに参加するたびに、IDを含むソケットの詳細が生成されます。これは、特定の人にメッセージを送信するのに本当に役立つIDです。

まず、すべてのsocket.idを配列に保存する必要があります。

var people={};

people[name] =  socket.id;

ここで、nameは受信者名です。例:

people["ccccc"]=2387423cjhgfwerwer23;

したがって、メッセージを送信するときはいつでも、受信者名でそのsocket.idを取得できます。

そのためには、レシーバー名を知る必要があります。サーバーにレシーバー名を送信する必要があります。

最後に:

 socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});

これがうまくいくことを願っています。

幸運を!!

25
Trojan

弊社のプロジェクトでは、「ルーム」アプローチを使用しています。名前は、会話内のすべてのユーザーのユーザーIDを一意の識別子として組み合わせたものです(実装はFacebookメッセンジャーに似ています)。例:

| id |名前| 1 |スコット| 2 |スーザン

「部屋」名は「1-2」(IDは昇順で注文されます)で、切断時にsocket.ioが自動的に部屋をクリーンアップします

この方法では、その部屋だけにメッセージを送信し、オンライン(接続された)ユーザーにのみ送信します(サーバー全体に送信されるパッケージが少なくなります)。

2
Rami

Socket.ioルームを使用して、よりシンプルにしましょう。サーバーに参加する一意の識別子を持つサーバーを要求します。ここでは、一意の識別子として電子メールを使用しています。

クライアントSocket.io

socket.on('connect', function () {
  socket.emit('join', {email: [email protected]});
});

ユーザーがサーバーに参加したら、そのユーザー用の部屋を作成します

サーバーSocket.io

io.on('connection', function (socket) {
   socket.on('join', function (data) {    
    socket.join(data.email);
  });
});

これで、参加する準備が整いました。ユーザーが聞くことができるように、サーバーtoルームから何かを送信します。

サーバーSocket.io

io.to('[email protected]').emit('message', {msg: 'hello world.'});

messageイベントをクライアント側でリッスンしてトピックを完成させましょう

socket.on("message", function(data) {
  alert(data.msg);
});

Socket.io rooms からの参照

0
Lalit Mohan