Socket.IO 1.0'da belirli bir ID'ye mesaj gönderme


85

Verileri belirli bir soket kimliğine göndermek istiyorum.

Bunu eski sürümlerde yapabiliyorduk:

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

Socket.IO 1.0'da benzer bir şey yapmaya nasıl devam edebilirim?

Yanıtlar:


206

Socket.io 1.0'da bunun için daha iyi bir yol sağlarlar. Her soket otomatik olarak kendi kimliğiyle varsayılan bir odaya katılır. Belgeleri kontrol edin: http://socket.io/docs/rooms-and-namespaces/#default-room

Böylece aşağıdaki kod ile id ile bir sokete yayabilirsiniz:

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

To (room_id) ve (user_socket_id) arasında fark var mı? Aslında bunu bir veya daha fazla kullanıcısı olan bir odaya mesaj göndermek için kullanıyorum. "Bu, mesajları diğer soketlere yayınlamayı kolaylaştırır:", bu durumda bir veya daha fazla olabilir, benzersiz bir özel değil.
Washington Botelho

@WashingtonBotelho, soket kimlikleri genellikle "Uj5CRqZ5b_Xubx9sAAAA" gibi görünür, bu yüzden teoride böyle bir odada birden fazla kullanıcı olabilir, ancak pratikte başka bir kullanıcının kişisel odasına ne zaman bir kullanıcı ekleyeceğimi bilmiyorum.
Oleg

9
Belirli bir kullanıcıyı socketId'ine göre nasıl tanımlayabiliriz, bu bir anahtar değer çifti kullanıcı (örneğin kullanıcı adı için) ve socketId'yi bir yerde saklamamız gerektiği anlamına mı gelir?
Sai

@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy

Bu çok mantıksız ... neden bize soket kimlik numarasına mesaj göndermenin bir yolunu sunmuyorsunuz ve bu kadar? Her neyse, olumlu oy verildi, aslında 2.x
Adry

94

Socket.io 1.0'da bunu aşağıdaki kodla yapabilirsiniz:

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

Güncelleme:

@ MustafaDokumacı'nın cevabı daha iyi bir çözüm içeriyor.


3
Bu cevap ile işaret edilen daha iyi cevap arasındaki fark, BU çözümle, hoş olan geri aramalara sahip olabilmenizdir. Ancak io.to (socketid) ile geri aramaları KULLANAMAZSINIZ.
Ramazan Polat

17

@Mustafa Dokumacı ve @ Meraklı zaten yeterince bilgi vermiş, soket id'sini nasıl alabileceğinizi ekliyorum.

Soket kimliğini almak için socket.id'yi kullanın :

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

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

6

Bir ad alanı kullandıysanız, aşağıdakilerin çalıştığını buldum:

//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');

Ad alanları hakkında daha fazla bilgi için: http://socket.io/docs/rooms-and-namespaces/


5

Hem @ Meraklı hem de @ MustafaDokumacı'nın işe yarayan çözümler sağladığına inanıyorum. Aradaki fark, @ MustafaDokumacı'nın çözümüyle mesajın yalnızca belirli bir müşteriye değil, bir odaya da yayınlanmasıdır.

Bir alındı ​​bildirimi istendiğinde fark belirgindir.

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

beklendiği gibi çalışır

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

ile başarısız

Error: Callbacks are not supported when broadcasting

1

Node.js'de -> socket.io -> indirmek için bir sohbet örneği var Bunu satıra yapıştır (bağlantıda io) kısmı ..% 100 çalışan bu kodu kullanıyorum

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);
  });
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.