私はsocket.io + node.jsから始めています。メッセージをローカルに送信し、socket.broadcast.emit()
関数をブロードキャストする方法を知っています:-接続されているすべてのクライアントが同じメッセージを受信します。
ここで、特定のクライアントにプライベート メッセージを送信する方法を知りたいと思います。つまり、2 人の間でプライベート チャットを行うための 1 つのソケット (クライアント間のストリーム) です。ありがとう。
私はsocket.io + node.jsから始めています。メッセージをローカルに送信し、socket.broadcast.emit()
関数をブロードキャストする方法を知っています:-接続されているすべてのクライアントが同じメッセージを受信します。
ここで、特定のクライアントにプライベート メッセージを送信する方法を知りたいと思います。つまり、2 人の間でプライベート チャットを行うための 1 つのソケット (クライアント間のストリーム) です。ありがとう。
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);
}
理解していただければ幸いです。
ユーザーが接続すると、電子メールのように一意である必要があるユーザー名を使用してサーバーにメッセージを送信する必要があります。
ユーザー名とソケットのペアは、次のようにオブジェクトに格納する必要があります。
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' と呼ばれるサーバーからの発行をリッスンし、データを読み取ることで、送信元と送信されたメッセージを処理できます。
socket.ioルームを参照できます。ソケットをハンドシェイクすると、「user.#{userid}」などの名前付きルームに彼を参加させることができます。
その後、次のような便利な名前でプライベート メッセージを任意のクライアントに送信できます。
io.sockets.in('user.125').emit('new_message', {text: "Hello world"})
上記の操作では、「new_message」をユーザー「125」に送信します。
ありがとう。
私たちの会社のプロジェクトでは、「部屋」アプローチを使用しており、その名前は、会話内のすべてのユーザーのユーザー ID を一意の識別子として組み合わせたものです (私たちの実装は、Facebook メッセンジャーに似ています)。例:
|ID | 名前 |1 | スコット |2 | スーザン
「部屋」の名前は「1-2」(ID は昇順) になり、切断時に socket.io が自動的に部屋をクリーンアップします。
このようにして、その部屋だけにメッセージを送信し、オンラインの (接続されている) ユーザーにのみ送信します (サーバー全体に送信されるパッケージが少なくなります)。