Socket IO отправляет на указанный идентификатор пользователя - PullRequest
3 голосов
/ 04 февраля 2012

Я хочу отправить данные указанному пользователю, и никому другому.

в настоящее время для передачи всем, кого я делаю:

socket.on('newChatMessage', function (message) {
socket.broadcast.emit('newChatMessage_response', { data: message});
});

Теперь то, что я хочу сделать, это просто что-то вроде:

socket.on('newChatMessage', function (message) {
socket.to(5).send('newChatMessage_response', { data: message});
});

- (5) будет пользователем с идентификатором 5.

Ответы [ 2 ]

7 голосов
/ 04 февраля 2012

Я думаю, что недостающий фрагмент находится внутри этой функции: io.sockets.on('connection', function(socket) { ... }); - Эта функция выполняется каждый раз, когда происходит событие подключения. И каждый раз, когда происходит это событие, аргумент «socket» ссылается на новый объект сокета, представляющий вновь подключенного пользователя. Затем вам нужно сохранить этот объект сокета где-нибудь так, чтобы вы могли найти его позже, чтобы вызвать для него метод send или emit, если вам нужно отправлять сообщения, которые будут видны только этому сокету.

Вот краткий пример, с которого стоит начать. ( Примечание : я не проверял это, и при этом я не рекомендую, чтобы это был лучший способ сделать то, что вы пытаетесь сделать. Я просто написал это в редакторе ответов, чтобы дать вам представление о как вы могли бы делать то, что вы хотите сделать)

var allSockets = [];
io.sockets.on('connection', function(socket) {
  var userId = allSockets.push(socket);
  socket.on('newChatMessage', function(message) {
    socket.broadcast.emit('newChatMessage_response', {data: message});
  });
  socket.on('privateChatMessage', function(message, toId) {
    allSockets[toId-1].emit('newPrivateMessage_response', {data: message});
  });
  socket.broadcast.emit('newUserArrival', 'New user arrived with id of: ' + userId);
});

Редактировать: Если по идентификатору вы ссылаетесь на значение идентификатора, которое назначает socket.io, а не на назначенное вами значение, вы можете получить сокет с определенным значением идентификатора, используя var socket = io.sockets.sockets['1981672396123987']; (синтаксис, проверенный выше с использованием socket.io v0.7.9)

0 голосов
/ 04 февраля 2012

Трудно сказать точно, как это сделать, не видя вашего полного кода, но похоже, что вы хотите вызвать метод emit для отдельного сокета, на который вы пытаетесь отправить. Если это отличается от сокета, устанавливающего соединение (т. Е. Частный партнер по чату), вам потребуется другой способ хранения и извлечения правильного сокета, с которым вы пытаетесь установить связь.

var sck = someFunctionToGetAppropriateSocketObject();
sck.emit('newChatMessage_response', { data: message});

см. http://socket.io/#how-to-use и https://github.com/learnboost/socket.io

...