Личное сообщение socket.io
Я скучал по Сети без везения. Я пытаюсь выяснить, как отправить личное сообщение от одного пользователя другому. Есть много фрагментов, но я не уверен в взаимодействии с клиентом и сервером. Если у меня есть идентификатор сокета, который я хочу отправить, как отправить его на сервер, и как я могу гарантировать, что сервер отправляет сообщение только этому гнезду приемника?
Есть ли учебник или пошаговое руководство, о котором каждый знает?
Ответы
Ответ 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);
});
});
См. Раздел " Объединение комнат" и " Излучение"