私はsocket.io + node.jsから始めています、メッセージをローカルに送信してsocket.broadcast.emit()
関数をブロードキャストする方法を知っています:-接続されているすべてのクライアントが同じメッセージを受信します。
今、私は特定のクライアントにプライベートメッセージを送信する方法を知りたいのですが、私は2人の間のプライベートチャット用の1つのソケットを意味します(クライアントからクライアントへのストリーム)。ありがとう。
私はsocket.io + node.jsから始めています、メッセージをローカルに送信してsocket.broadcast.emit()
関数をブロードキャストする方法を知っています:-接続されているすべてのクライアントが同じメッセージを受信します。
今、私は特定のクライアントにプライベートメッセージを送信する方法を知りたいのですが、私は2人の間のプライベートチャット用の1つのソケットを意味します(クライアントからクライアントへのストリーム)。ありがとう。
回答:
ユーザーが接続するとき、それは電子メールのように一意でなければならないユーザー名でサーバーにメッセージを送るべきです。
ユーザー名とソケットのペアは、次のようなオブジェクトに保存する必要があります。
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ルームを使用できます。クライアント側から、一意の識別子(メール、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);
}
私はあなたがアイデアを得ることを望みます。
socket.io-redis
。
{email: user1@example.com}
すべての接続を異なるようにできますか?アプリにアクセスするすべてのクライアントuser1@example.com
にユーザーuser2@example.com
がいません これが迷惑な質問である場合はごめんなさい。
承知しました: 単純に、
これはあなたが必要なものです:
io.to(socket.id).emit("event", data);
ユーザーがサーバーに参加するたびに、IDを含むソケットの詳細が生成されます。これは、特定の人にメッセージを送信するのに役立つIDです。
最初に、すべてのsocket.idsを配列に格納する必要があります。
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);
});
これがあなたのためにうまくいくことを願っています。
幸運を!!
socket.io ルームを参照できます。ソケットをハンドシェイクすると、名前付きの部屋に参加できます(例: "user。#{userid}")。
その後、便利な名前で任意のクライアントにプライベートメッセージを送信できます。次に例を示します。
io.sockets.in( 'user.125')。emit( 'new_message'、{text: "Hello world"})
上記の操作では、「new_message」をユーザー「125」に送信します。
ありがとう。
socket.ioの部屋でそれをもっと簡単にしましょう。一意の識別子を持つサーバーにサーバーに参加するように要求します。ここでは、一意の識別子としてメールを使用しています。
クライアントSocket.io
socket.on('connect', function () {
socket.emit('join', {email: user@example.com});
});
ユーザーがサーバーに参加したら、そのユーザー用の部屋を作成します
サーバーSocket.io
io.on('connection', function (socket) {
socket.on('join', function (data) {
socket.join(data.email);
});
});
これで参加の準備が整いました。サーバーから何かを放出させましょうto
ユーザーが聞くことができるようにルーム。
サーバーSocket.io
io.to('user@example.com').emit('message', {msg: 'hello world.'});
message
クライアント側でイベントを聞いてトピックを完成させましょう
socket.on("message", function(data) {
alert(data.msg);
});
Socket.ioルームからの参照