私は運が悪くてネットを精査してきました。あるユーザーから別のユーザーにプライベート メッセージを送信する方法を見つけようとしています。スニペットはたくさんありますが、クライアントとサーバーの相互作用についてはよくわかりません。送信先のソケットの ID を持っている場合、それをサーバーに送信するにはどうすればよいですか? また、サーバーがメッセージをその 1 つの受信側ソケットにのみ送信するようにするにはどうすればよいですか?
誰もが知っているチュートリアルやウォークスルーはありますか?
チュートリアルは必要ありません。Socket.IO FAQは、これについては非常に簡単です。
socket.emit('news', { hello: 'world' });
編集:socket
後でそのオブジェクトを取得する方法について尋ねるとき、人々はこの質問にリンクしています。する必要はありません。新しいクライアントが接続したら、ユーザー情報を保持しているオブジェクトにそのソケットへの参照を保存します。下からの私のコメント:
スクリプトのどこかに、ユーザーの情報を保持するオブジェクトを設定します。
var connectedUsers = {};
.on('connection')
関数で、そのソケットを新しいオブジェクトに追加します。connectedUsers[USER_NAME_HERE] = socket;
その後、後で簡単に取得できます。connectedUsers[USER_NAME_HERE].emit('something', 'something');
役立つコードスニペットを次に示します。
クライアント側 (メッセージの送信)
socket.emit("private", { msg: chatMsg.val(), to: selected.text() });
ここでto
、プライベート メッセージを送信する ID を参照しmsg
、コンテンツです。
クライアント側(メッセージ受信)
socket.on("private", function(data) {
chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>');
});
chatLog
チャット メッセージを表示する div はどこにありますか。
サーバ側
client.on("private", function(data) {
io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg });
client.emit("private", { from: client.id, to: data.to, msg: data.msg });
});
私が考えることができる最も簡単な方法は、IDまたは名前をキーとして使用してすべてのユーザーのハッシュを持ち、値の一部としてソケットを持ち、メッセージを送信したいときにそのソケットをプルし、その上で放出します...次のようなもの:
users[toUser].emit('msg',"Hello, "+toUser+"!");
uid でユーザーを登録している Web サイトがある場合は、ユーザーごとにルームを作成し、ユーザーの uid でルームに名前を付けることができます。
最初に次を使用してクライアントをサーバーに接続します。
var socket = io('server_url');
サーバー側で、クライアント接続を検出するためのイベントを作成します。
io.on('connection', function (socket) {}
次に、その中のクライアントにsocket.emit();
発行し、現在のユーザーの uid を尋ねることができます。
クライアント側でこのリクエストのイベントを作成し、ユーザーの uid をサーバーに送信します。
サーバー側で、次を使用して、接続されたソケットを部屋に参加させます。
socket.join(uid);
console.log('user ' + socket.user + ' connected \n');
次の行を使用して、ユーザーにプライベート メッセージを送信できるようになりました。
io.to(uid).emit();
上記のコードを使用する場合、ユーザーが Web サイトから既に開いているタブの数は関係ありません。各タブは同じ部屋に接続されます。
socket.io 1.0 での使用
io.sockets.connected[<socketid>]
ソケットIDだけを保存できます。そのようです:
var users = {};
users[USER_NAME] = socket.id;
それから:
io.sockets.connected[users[USER_NAME]]
.emit('private', {
msg:'private message for user with name '+ USER_NAME
});