115

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

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

4

7 に答える 7

312

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

クライアント側:

var socket = io.connect('http://localhost');
socket.emit('join', {email: user1@example.com});

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

サーバ側:

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('user1@example.com').emit('new_msg', {msg: 'hello'});

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

クライアント側:

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

理解していただければ幸いです。

于 2013-07-08T20:07:43.203 に答える
109

ユーザーが接続すると、電子メールのように一意である必要があるユーザー名を使用してサーバーにメッセージを送信する必要があります。

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

var users = {
    'userA@example.com': [socket object],
    'userB@example.com': [socket object],
    'userC@example.com': [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' と呼ばれるサーバーからの発行をリッスンし、データを読み取ることで、送信元と送信されたメッセージを処理できます。

于 2013-07-08T10:01:26.183 に答える
12

socket.ioルームを参照できます。ソケットをハンドシェイクすると、「user.#{userid}」などの名前付きルームに彼を参加させることができます。

その後、次のような便利な名前でプライベート メッセージを任意のクライアントに送信できます。

io.sockets.in('user.125').emit('new_message', {text: "Hello world"})

上記の操作では、「new_message」をユーザー「125」に送信します。

ありがとう。

于 2013-07-05T14:18:40.910 に答える
6

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

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

「部屋」の名前は「1-2」(ID は昇順) になり、切断時に socket.io が自動的に部屋をクリーンアップします。

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

于 2016-07-20T19:22:04.190 に答える