v2.5.2
Giriş yap

node js, socket.io oda ve özel mesaj

alphabet
1,543 defa görüntülendi ve 3 kişi tarafından değerlendirildi

Merhabalar, nodejs ve socket.io kullanarak sohbet uygulaması yapmaya çalışıyorum. İnternette bulduğum kaynakları kullanarak oda olayını yapmaya çalıştım fakat beceremiyorum.

Server:

    io.on('connection', function(socket){
        socket.on('room', function(room) {
            socket.join(room);
        });
    
        socket.on('chat', function(msg){
            io.emit('chat', msg);
        });
    });

Client:

var socket = io.connect('***'); // server ipsi yazarak bağlanabiliyorum

socket.emit('room','2'); // 2 isimli odaya bağlanmaya çalışıyorum

$('form').submit(function(){
  socket.emit('chat', {"name": $('#n').val(), "message": $('#m').val()}); // isim ile mesaj gönderme kısmında da sorun yok
  $('#m').val('');
  return false;
});
    
socket.on('chat', function(msg){
  $('#messages').append($('<li>').html("<b>"+msg.name+":</b> "+msg.message)); // mesajları alarak html'e ekleyebiliyorum. sorunsuz.
});

Bu kodlar şu anda yüklü fakat oda olayı çalışmıyor.
Eğer 2 isimli odaya bağlanma kodlarımda bir sorun yoksa ve bağlanıyorsa, farklı bir sekme açıp 1 odasına bağlanıp mesaj gönderdiğimde, bu mesajlar neden 2 numaralı odaya bağlı olan sekmeye düşüyor?

İstediğim tam olarak şu;

Sayfa yüklendiğinde x odasına bağlansın ve gönderilen tüm mesajlar x odasındakilere gönderilsin. Ayrıca alınan mesajlar da sadece x odasına gönderilen mesajlar olsun. Ayrıca kullanıcıların birbirine özel mesaj gönderebilmesini nasıl yapabilirim?

Cevaplarınız için şimdiden teşekkürler.

caldwell
1486 gün önce

Sorun gördüğüm kadarıyla bu kod da

socket.on('chat', function(msg){
    io.emit('chat', msg);
});

io.emit yaparsan o sockete bağlı bütün clientlere data gönderirsin senin de dediğin gibi mesajları
göndereceğin yeri sınırlamak için room kullanılıyor

Bu kod da gelen room'a bağlanıyorsun fakat o room'a mesaj göndermiyorsun.

socket.on('room', function(room) {
    socket.join(room);
});

Altta ki kod ile yapmak sadece bağlandığın odaya mesaj gönderirsin.

io.on('connection', socket => {
    socket.on('room', room => {
        socket.join(room);
        socket.joinRoom = room; // Eğer birden çok odaya bağlanacaksan joinRoom'u array olarak da tanımlayabilirsin.
    });

    socket.on('chat', msg => {
        io.to(socket.joinRoom).emit('chat', msg);
    });
});

Son soruna gelecek olursak kullanıcıların özel olarak birbiriyle mesajlaşması için socket.id kullanılıyor.

socket.on('chat', msg => {
    io.in(socket.id).emit('chat', msg); // io.in ve io.to aynı işi yapıyor.
});

Eğer yapılmış chat kodlarını incelemek istersen benim de daha yeni geliştirmiş olduğum chat'in kodlarına bakabilirsin.
Chat Kodları

Hatalı veya eksik bilgi vermiş olabilirim bende pek bilmiyorum socket.io yu :)