node js, socket.io oda ve özel mesaj
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.
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 :)