Надсилання повідомлення на певний ідентифікатор у Socket.IO 1.0


85

Я хочу надіслати дані на один конкретний ідентифікатор сокета.

Раніше ми могли робити це в попередніх версіях:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Як би я зробив щось подібне в Socket.IO 1.0?

Відповіді:


206

У socket.io 1.0 вони забезпечують кращий спосіб для цього. Кожна розетка автоматично приєднується до кімнати за замовчуванням за допомогою ідентифікатора. Перевірка документів: http://socket.io/docs/rooms-and-namespaces/#default-room

Таким чином, ви можете видати в сокет за допомогою ідентифікатора наступний код:

io.to(socketid).emit('message', 'for your eyes only');

Є різниця між (room_id) та (user_socket_id)? Я фактично використовую його для надсилання повідомлення в кімнату, в якій може бути один або кілька користувачів. "Це полегшує трансляцію повідомлень в інші сокети:", тоді може бути одним або кількома, а не унікальним приватним.
Washington Botelho,

@WashingtonBotelho, ідентифікатори розетки зазвичай виглядають приблизно так, як "Uj5CRqZ5b_Xubx9sAAAA", тому теоретично в такій кімнаті може бути більше одного користувача, але на практиці я не знаю випадків, коли б я додав користувача до особистої кімнати іншого користувача.
Олег

9
Як ми можемо визначити конкретного користувача за його socketId, чи означає це, що нам потрібно десь зберігати пару значень ключа користувача (наприклад, ім’я користувача) та socketId?
Сай

@Mustafa Dokumacı Merhaba, Бана бір yardim і ін stackoverflow.com/questions/38817680 / ...
Махді pishguy

Це просто так нелогічно ... чому б нам просто не надати нам спосіб надіслати повідомлення на ідентифікаційний номер розетки, і все? У будь-якому випадку, проголосовано, єдина робота, яка насправді працює на 2.x
Адрі

94

У socket.io 1.0 ви можете зробити це за допомогою наступного коду:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

Оновлення:

Відповідь @ MustafaDokumacı містить краще рішення.


3
Різниця між цією та кращою відповідями полягає в тому, що за допомогою ЦЕГО рішення ви можете мати зворотні дзвінки, що приємно. Але з io.to (socketid) ви НЕ МОЖЕТЕ використовувати зворотні дзвінки.
Рамазан Полат,

17

@Mustafa Dokumacı та @Curious вже надали достатньо інформації, я додаю, як ви можете отримати ідентифікатор сокета.

Щоб отримати ідентифікатор сокета, використовуйте socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}

6

Якщо ви використовували простір імен, я виявив, що працює наступне:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

Докладніше про простори імен: http://socket.io/docs/rooms-and-namespaces/


5

Я вважаю, що і @Curious, і @ MustafaDokumacı надали рішення, які добре працюють. Однак різниця полягає в тому, що за рішенням @ MustafaDokumacı повідомлення транслюється до кімнати, а не лише до конкретного клієнта.

Різниця помітна, коли вимагається підтвердження.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

працює як очікувалось, поки

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

не вдається з

Error: Callbacks are not supported when broadcasting

1

у Node.js -> socket.io -> є приклад чату для завантаження Вставте це в рядок (io при підключенні) частина .. я використовую цей код, який працює на 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.