Подтвердить что ты не робот

Личное сообщение socket.io

Я скучал по Сети без везения. Я пытаюсь выяснить, как отправить личное сообщение от одного пользователя другому. Есть много фрагментов, но я не уверен в взаимодействии с клиентом и сервером. Если у меня есть идентификатор сокета, который я хочу отправить, как отправить его на сервер, и как я могу гарантировать, что сервер отправляет сообщение только этому гнезду приемника?

Есть ли учебник или пошаговое руководство, о котором каждый знает?

4b9b3361

Ответ 1

Нет необходимости в учебнике. Socket.IO FAQ довольно прост в этом:

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

РЕДАКТИРОВАТЬ: Люди обращаются к этому вопросу, когда спрашивают о том, как получить этот socket объект позже. Нет необходимости. Когда новый клиент подключается, сохраните ссылку на этот сокет на любом объекте, на котором вы храните информацию о пользователе. Мой комментарий ниже:

В верхней части вашего script где-нибудь, настройте объект, чтобы хранить информацию своих пользователей.

var connectedUsers = {};

В вашей функции .on('connection') добавьте этот сокет в новый объект. connectedUsers[USER_NAME_HERE] = socket; Затем вы можете легко получить его позже. connectedUsers[USER_NAME_HERE].emit('something', 'something');

Ответ 2

Вот фрагмент кода, который должен помочь:

Клиентская сторона (отправка сообщения)

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

Ответ 3

Самый простой способ, о котором я могу думать, - иметь хэш всех пользователей при использовании их идентификатора или имени в качестве ключа и иметь свой сокет как часть значения, тогда, когда вы хотите отправить сообщение только им, этот сокет и испустить на нем... что-то вроде этого:

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

Ответ 4

Хотя у нас есть хорошие ответы здесь. Тем не менее, я не мог достаточно быстро понять уникальную идентификацию пользователя на клиентском сервере, поэтому я публикую эти простые шаги, чтобы помочь тому, кто борется, как я...

На стороне клиента, получить идентификатор пользователя, в моем случае я получаю имя пользователя...

Регистрация пользователя на стороне клиента

//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 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

в socket.io 1.0 используйте

io.sockets.connected[<socketid>]

вы можете хранить только идентификатор сокета. так:

var users = {};
users[USER_NAME] = socket.id;

то

io.sockets.connected[users[USER_NAME]]
   .emit('private', {
       msg:'private message for user with name '+ USER_NAME
   });

Ответ 6

Если у вас есть веб-сайт, на котором есть зарегистрированные пользователи с помощью uid, вы можете создать комнату для каждого пользователя и назвать комнату с помощью uid пользователя.

Сначала подключите клиента к серверу, используя:

var socket = io('server_url');

на стороне сервера создайте событие для обнаружения клиентского соединения:

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

тогда вы можете socket.emit(); клиенту внутри него с помощью socket.emit(); и спросите UID текущего пользователя.

на стороне клиента создайте событие для этого запроса и затем отправьте uid пользователя на сервер.

Теперь на стороне сервера присоедините подключенный сокет к комнате, используя:

socket.join(uid);
console.log('user ' + socket.user + ' connected \n');

теперь вы можете отправить личное сообщение пользователю, используя следующую строку:

io.to(uid).emit();

Если вы используете приведенный выше код, не имеет значения, сколько вкладок пользователь уже открыл с вашего веб-сайта. каждая вкладка будет соединена с одной и той же комнатой.

Ответ 7

Вы можете создать уникальную комнату для обмена сообщениями между 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);
   });

});

См. Раздел " Объединение комнат" и " Излучение"