Html - CSS - XML - JavaScript - Ajax
Nodejs Ve Socket.İo Üzerinde 2 Kişinin Birbiri İle İletişimini Sağlama
Nodejs Ve Socket.İo Üzerinde 2 Kişinin Birbiri İle İletişimini Sağlama
-
Selam arkadaşlar,
NodeJs ile okula bir proje ödevi yapıyorum. Proje öğrencilerin kendi arasında konuşabileceği bir sohbet uygulaması ancak ben aynı zamanda öğrenmek için sıfırdan kodluyorum. Piyasadan çalmıyorum yani...
Şimdi sorum şu,,
Servera 30 kişi bağlı ve otuzuda aynı pencereye yazı yazabiliyor bunda her hangi bir sıkıntı yok,
Ben servera bağlı olan kişilerin hepsine "socket.broadcast.emit('mesajgitti', datayeni);" komutu ile toplu olarak mesajda gönderebiliyorum. Bundada sıkıntı yok...
Soru şu
Ancak facebooktaki gibi 2 kişi kendi arasında mesajlaşma yaptığında bunu tüm server a değil aralarında sabit bir değişken ile mesajlaştırmam lazım. Yani sadece bu 2 kişi kendi arasında bağlantı kurdurtmam lazım.
Örnek vermem gerekirse (saçmalıyorum biraz daha kendimi anlatabilmek için)
x ve y arasındaki konuşmada.
X mesajı yazdı ve entera bastı server.js de socket.broadcast.emit.y('mesajgitti', datayeni); gibi bir şekilde yollamalıyım ki bunu sadece client y görebilsin ve isteği alsın.
Çok çok teşekkürler, tecrübeli arkadaşları desteğe davet ediyorum :)
-
bunu iki şekilde halledebilirsin. aslında web için çok bilgim yok sadece senaryo üzerinden gideyim..
1- her client ın bir unique id si olur, ve gönderilen mesaj içerisinde bu unique id barındırılır. bu id ler client ın kendi idsi ve gönderdiği kişinin id si olacak. sunucu yazılımı da buna göre mesajı gönderen client ın kime gönderdiğinin id den tespit edip o client a mesajı iletecek.
2- yine aynı şekilde tüm clientların id leri olacak, bir client başka bir client a mesaj yazdığında, bu mesaj tüm clientlara iletilecek, ancak client yazılımı gelen mesajdaki id ye bakacak (1. maddedeki gibi gönderilenin id sini de barındırıyor mesaj), bu id yi kendi id siyle karşılaştıracak eğer eşit ise mesajı gösterecek, değilse es geçecek.
bu dediğim şeyler ağ topolojilerinde vardı ancak uzun zaman geçtiği için unuttum :) 2. yöntem trafiği daha çok yoracaktır. çünkü gereksiz şekilde mesajlar başka clientlara gidecektir.
nodejs ya da socket.io hiç kullanmadım. bu tarz bir protokol için cometD kullanmıştım. bilmiyorum php için var mı ya da türevi var mıdır.. o zaman yaptığımız sistemde 2. maddedeki gibi çalışıyordu.tabi adamların sunucuları da güçlüydü ve çok fazla iş olmuyor diye bu şekil bir tasarım yapmışlardı..
-
üstad, inan senaryoların çok daha komplekslerini düşündümi bu senaryolarla zaten bunu yapabiliyorum. Jquery sok.
Benzersiz ıd tanım, o id user ın mesaj alanındaki div id sine eşitse içerisine gel mesajı yaz gibi bir çok senaryo var.
Ama nodejs varsa bunlara gerek yok onu biliyorum. Yani client sunucuyu bir yolla dinliyor, o zaman kendisine ait bir şey yollandığında sadece bunuda dinleyebilmeli...
Sanırım buldum araştırmalarımda deniyorum eğer başarılı olursa burayada yazacağım.
Teşekkürler yinede.
Bu arada arkadaşlar hala yoruma ve desteğe açıktır konu
-
şimdi ilk önce basit olarak socket.io nun sitesindeki gibi bir uygulama yap öğren nasıl kullanıldığını
daha sonra basit bir üye girişi yap nodejs, session, express ile
şimdi sırada sockete sırada socketlerin hangi session ile bağlandığını bulmak lazım bunun için socket connect eventından önce
authorization eventına gelir burda bu socketin headerlarını parsele sid i bul senin sessionlarının tuttuğun listede arattır kime ait olduğunu bul bu sockete kullanıcı adı vs değişken ata
şimdi socketlerin hangi üyelik üzerinde olduğunu biliyorsun senin yazdığın boardcast olayı bütün hepsine dağıtır öyle yapma herkese iletirsen o iş sakat güvenlik 0 :D, socket bağlandığını bir listeye kayıt et disconnect olduğunda listeden çıkart veya zaten bu listeyi io.sockets.foreach tarzında kullanabiliyorsun tam emin değilim koddan böyle de istediğin sockete veri gönderebilirsinayrıntılı bişeyler istersen kod parçaları yollayabilirim, ben bu şekilde aktif olarak kullanıyorum başka yöntemler vardır yoktur bilmemem o kadarını :D
detCode tarafından 11/Mar/14 03:11 tarihinde düzenlenmiştir -
ben benzer bir seyi C++ ile yapmak zorunda kaldiydim, acilan soketleri handlerlarini tutuyordum, sonra o handla sadace yolluyordum gelen veri p2p olacak ise.
-
var clientlist {};
io.sockets.on('connection', function(socket) {
clientlist[socket.id] = socket;
}
Böyle her client'i bir objede tutarak halledemez misin?
-
KrypT bunu yazdı
var clientlist {};
io.sockets.on('connection', function(socket) {
clientlist[socket.id] = socket;
}
Böyle her client'i bir objede tutarak halledemez misin?
KrypT reyiz olaya mantıklı yaklaşmış bencede obje ile çözebilirsin.
-
Aynen araştırmalarımda bu örneği gördüm ancak uygulayacak zamanım yok. Bi uygulayım sonra burayada yazarım.
Bu arada kardeşim o kod parçalarını yayımlayabilirsen örnekleri incelemiş oluruz biraz daha bir şeylerde kendimizi aşmış oluruz.
Bu arada nodejs , socket.io,node-mysql gibi kütüphaneleri kullanıyorum üye girişi mesaj yazımında veri tabanından güvenlik kontrolünü felan yaptırıyorum.
Bunun yanında node-js nin node-connect kütüphanesi var onuda inceledim ama çözmekle uğraşıyorum.
Bilgisi olan yazsın hem ben hemde bu işle ilgilnen diğer arkadaşlar için güzel oluş olur.
Teşşkürler.
-
hocam mysql filan kullanmana gerek yok mongodb gibi bi nimet varken
@Krypt in dediği gibide yapılabilir benim yaptığım socketlere session tanımlaması yapmak
io.sockets.authorization(function(handshakeData, callback) {
//socket in hangi session ile bağlandığını buluyoruz tabi adamın bağlanmadan önce üye girişi yapması gerek express nodejs ile basit bi üye giriş sayfası yaparsın, üye girdiğinde sessionuna username tanımlama yap, sessionstore filan tanımla nodejs için authorization kısmında lazım olucak
if (!handshakeData.headers.cookie)
{
callback('socket.io: no found cookie4.', false);
}
else
{
var signedCookies = require('cookie').parse(handshakeData.headers.cookie);
handshakeData.cookies = require('express/node_modules/connect/lib/utils').parseSignedCookies(signedCookies, 'web_secret');
var sid = handshakeData.cookies['connect.sid'];
sessionStore.get(sid, function(err, session) {
if (err || !session) return callback('socket.io: no found session.', false);
//tamam session bulduk ve kullanıcı girişi yapmış hata yok
if (session.username != undefined && session.username != '')
{//socket.io da session tarzı socketlere tek seferlik değişken eklenebiliyor aşadaki gibi sessiondaki verileri sockete geçirdim
//socketin hangi usernameden bağlandığı şuanda belli
handshakeData.session = {'username': session.username, 'ip': session.ip, 'uid' : session.uid, 'sid': sid};
return callback(null, true);
}
else
{
return callback('socket.io: no found session.user', false);
}
});
}
});io.sockets.on('connection', function (client) {
//buraya gelmeden önce sockete session atamak istiyoruz kimden bağlandığını bulmak için
//authorization dan false callback dönerse hiç buraya atlamaz yani bağlantıyı kabul etmez session u olmayan bir socket gelince vs.
}
istediğin zaman aşadaki gibi istediğin username'i olan sockete yollarsın veriyi
var uname= 'test';
io.sockets.clients().forEach(function (Sock) { //bütün bağlı olan socketleri foreach yaptık bu kısım performans açısından geliştirilebilir
if (Sock.handshake.session.username == uname)
{
Sock.emit('fcn',''); //sadece username'i uname değişkeninde tanımlı olana gönderdik
}
}); -
hocam r10daki bu arkadaş sen misin
http://www.r10.net/php/1223935-php-node-bire-bir-chat-mantigi.html
-
arkadaşlar hepinize teşekkür ederim.
Sistem malesef daha tecrübeli olduğum mysql üzerinden gitmek zorunda. Çünkü android platformlarıda bağlanacak bu projeye. Bilgim olayan bir şeyi öğreneceğime mysql den çözerim ben bu işi.
node-mysql üzerinden gerekli işlemleri yaptırıyorum zaten.
Ayrıca
io.sockets.on('connection',function(socket){
io.sockets.sockets['kullaniciadi']= socket.id;
client.on("chat",function(data){
var sock_id = io.sockets.sockets['kullaniciadi']
io.sockets.sockets[sock_id].emit("ozelyolla",datayeni)
;})
;});
olarak kişiler arasında mesaj attırabilirim.
2. bir yol daha buldum.
socket.join('oda1deyim'); // 2 kullanıcı arasında bir oda açabiliyorum.
io.sockets.in('oda1deyim').emit('browser_kameralichatgeldi', digerparametreler); //baglı kişi dahil odadaki herkese attırabiliyorum
socket.broadcast.to('oda1deyim').emit("fonksiyon", parametre); //baglı kişi hariç odadaki herkesede bu şekilde attırabiliyorum.
Sanırım aşarım ben bu işi bir sonraki soruma kadar görüşmek üzere.
Bu arada emeği geçen arkadaşlara çok çok teşekkürler.
Çok sağolun.
Edit : Genki ben değilim üstad. Benim nick başka orda sadece reklam amaçlı projelerin tanıtımı için kullanıyorum orayı. Yoksa hiç bir işe yaramaz bi platform sevemedim yıllardır.
Erdem tarafından 11/Mar/14 15:48 tarihinde düzenlenmiştir