web-dev-qa-db-ja.com

socket.ioプライベートメッセージ

私は運が悪いとネットを精査してきた。あるユーザーから別のユーザーにプライベートメッセージを送信する方法を理解しようとしています。スニペットはたくさんありますが、クライアント/サーバーの相互作用についてはわかりません。送信したいソケットのIDがある場合、それをサーバーに送信する方法、およびサーバーがメッセージをその1つの受信ソケットにのみ送信するようにするにはどうすればよいですか?

誰もが知っているチュートリアルやチュートリアルはありますか?

22
Trevor Newhook

チュートリアルは必要ありません。 Socket.IO FAQ はこれについては非常に簡単です。

_socket.emit('news', { hello: 'world' });
_

EDIT:後でそのsocketオブジェクトを取得する方法について質問するとき、人々はこの質問にリンクしています。する必要はありません。新しいクライアントが接続したら、ユーザー情報を保持しているオブジェクトにそのソケットへの参照を保存します。下からの私のコメント:

スクリプトの上部のどこかに、ユーザーの情報を保持するオブジェクトを設定します。

_var connectedUsers = {};_

.on('connection')関数で、そのソケットを新しいオブジェクトに追加します。 _connectedUsers[USER_NAME_HERE] = socket;_その後、後で簡単に取得できます。 connectedUsers[USER_NAME_HERE].emit('something', 'something');

32
Brad

役立つコードスニペットを次に示します。

クライアント側(メッセージを送信)

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 });
});
21
almypal

私が考えることができる最も簡単な方法は、IDまたは名前をキーとして使用するときにすべてのユーザーのハッシュを取得し、値の一部としてソケットを使用することです。その場合、ユーザーにメッセージを送信する場合は、そのソケットをプルし、その上に放出...このようなもの:

users[toUser].emit('msg',"Hello, "+toUser+"!");
6
Matthew Clark

ここに素敵な答えがありますが。ただし、クライアントサーバー全体の一意のユーザーIDをすぐに把握できなかったため、この簡単な手順を投稿して、私がやったように苦労している人を助けます。

クライアント側で、ユーザーのIDを取得します。私の場合、ユーザー名を取得しています...

クライアント側ユーザー登録

//Connect socket.io     
var systemUrl = 'http://localhost:4000';
var socket = io.connect(systemUrl);

//Collect User identity from the client side
var username = Prompt('Enter your Username');
socket.emit('register',username);

接続されたソケットにユーザーのソケットを登録するためにサーバー側で登録を聞く

サーブサイドコードユーザー登録

/*Craete an empty object to collect connected users*/
var connectedUsers = {};

io.on('connection',function(socket){

/*Register connected user*/
    socket.on('register',function(username){
        socket.username = username;
        connectedUsers[username] = socket;
    });
});

クライアント側からメッセージを送信

$(document).on('click','.username',function(){
    var username = $(this).text(),
        message = Prompt("type your message");

    socket.emit('private_chat',{
        to : username,
        message : message
    });
});

サーバーでメッセージを受信し、プライベートユーザーに送信します

/*Private chat*/
socket.on('private_chat',function(data){
    const to = data.to,
            message = data.message;

    if(connectedUsers.hasOwnProperty(to)){
        connectedUsers[to].emit('private_chat',{
            //The sender's username
            username : socket.username,

            //Message sent to receiver
            message : message
        });
    }

}); 

クライアントでメッセージを受信して​​表示

/*Received private messages*/
socket.on('private_chat',function(data){
    var username = data.username;
    var message = data.message;

    alert(username+': '+message);
});

これは最高ではありませんが、ここから始めることができます。

5
Peter Moses

ユーザーを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サイトから既に開いているタブユーザーの数は関係ありません。各タブは同じ部屋に接続します。

3
Ali_Hr

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
   });
1
user3506100

USER_AとUSER_Bの間でメッセージを送信するための一意のルームを作成でき、両方のユーザーがこのルームに参加する必要があります。 UUIDをROOM_ID(次の例では「socketId」)として使用できます。

io.on('connection', socket => {

   socket.on('message', message => {
       socket.to(message.socketId).emit('message', message);
   });

   socket.on('join', socketId => {
       socket.join(socketId);
   });

});

Joining Rooms および Emit Cheatsheet を参照してください

0
J. Jerez