Socket.İo Bağlantı
-
Hocalarım Şöyle bir sorunum var. benim bi Script kodum var ve bunu tarayıcının bütününde çalıştırmak istiyorum tıpkı Session Cookie gibi. Yani tek bir sefer Socket'i tanımlayıp bütün browser de çekmek istiyorum bu Session'u. Ama nasıl olacak. Socket.io kullanıyorum. Tüm sayfalarda Socket bağlantısı yapıyorum Socket'i kullanmak için . Böyle olunca da her sayfa açıldığınca Connect olduğu için socket değişiyor. Böyle olunca da sıkıntı büyüyor adama 1 veri gönderirken son socket'e gönderdiğim için tum tarayıcıda veri emit edilmiyor. Facebook veya Twitter gibi düşünün. Herhangi bir sayfada da olursanız Mesaj/bildirim vs geldiği anda tüm sayfalarda güncelleme oluyor. Bende de bütün sayfalarda farklı bir connection olduğu için bütün sayfalara tek seferde emit edemiyorum. Şöyle bir mantık oluyor ama kullanışlı olmayacak ve saçma bir mantık gibi geldi.
Bir User Array'im olsun Bu array içinde UserBilgileri olsun User Bilgilerin içinde ise Sockets olsun yani User[x].UserBilgiler.Sockets olsun ve ben bütün connection'ları bu şekilde Biriktirip mesaj veya bildirim geldiği anda hepsine tek tek emit mi ettireyim ? Bu şekilde çalışır ama Hantal çalışır ID'lerde çakışma olabilir. vs vs birsürü sorun çıkabiliyor böyle bir mantık kurgulayınca.
Facebook veya Twitter bu işi nasıl yapabilir ? Client tarafında nasıl tek seferde çalıştırabiliyorlar ? Client tarafında tek socket tanımlayıp her sayfada bunu nasıl çağırıp işlem yaptırabiliyorlar ? Bilginiz var mıdır ? Bu sorunu nasıl çözebilirim ?
Socket'i Cookie içerisine atabilirsem her seferinde Cookie'yi çağırıp içindeki socket ile işlem yaptırırım ama nasıl olacak ? Cookie ye Socket'i nasıl aktaracağım ?
4-5 gündür uğraşıyorum bir çözüm üretemedim. Yardımcı olabilecek birileri var mı ? Böyle bir sorunla karşılaşanlar bizimle de paylaşırsa çok iyi olur :(
Iyi forumlar
-
socket.id den bağımsız olarak işlem yapabilirsin. bunun için şahsen sunucu tarafında aşağıdakine benzer bir kod kullanıyordum:
socket.emit("check_auth", function(data){ if(data.status == true) { //mevcut kullanıcı işlemleri } else { //yeni kullanıcı işlemleri } });browser'da ise:
socket.on('check_auth', function(data) { if (authenticated == true) { data({status:true, key:auth_key}); } else if (authenticated == false) { auth_key = auth_key_produced; data({status:false, key:auth_key}); } });gibi bir kod vardı. Özetle, s o c k e t . i o yeni bir bağlantı açtığında bağlanan c l i e n t'e hemen "check_auth" diye bişey emit edip, oradan gelen yanıta göre (data) ya kullanıcı için yeni bilgiler oluşturuyor, ya da var olan bir kullanıcı ise veritabanından bilgilerini çekip eski oturumunu devam ettiriyordu. bunu ben bağlantı kesildiğinde kullanıcı olaydan etkilenmesin, yeniden bağlandığında eskisi gibi devam edebilsin diye yapmıştım.
sen gereken bilgileri c o o k i e'de saklayabilirsin. ben burada socket.id 'i sunucu tarafında kullanmıyor, onun yerine auth_key dediğim rastgele üretilen bişey kullanıyordum. auth_key bünyesinde socket.id 'yi de db de tutuyordum. lazım olunca kullanıyordum.
RockZs tarafından 23/Ağu/16 14:48 tarihinde düzenlenmiştir -
Hocam bunda bunda sıkıntı yok ki . Sen bu Socket'i birden fazla php dosyasında kullanabiliyor musun ? Benim için bu önemli yoksa Aynı şekilde bir sistem bende de var ama her sayfada o socket'i kullanamıyorum sorun da o.Express-session diye birşey buldum oturum acılan cihazı session olarak atıyor o session'a emit ediliyor veriler ama kullanışı hakkında biraz araştırıyorum sıkıntıları cok fazla çözemiyorum bunu çözemezsem başka bir yol deneyeceğim. Senin söylediğin iş bende de var
Connectiondan sonra Bilgiler diye bir fonksiyona emit ediyorum bilgileri eğer o kullanıcı mevcut ise socket'i değiştiriyorum çünkü eski socket ölü kalıyor. Sen muhtemelen tek sayfada socket'i çalıştırıyorsun örneğin Chat vs. Bende bütün yapı socket'e bağlı olduğu için onu tek bir değişkenmiş gibi kullanmam gerekiyor . Socket.Conenction işlemi tek seferli olmalı her sayfada ayrı socket verince Gümlüyor.
EDİT :
-------Neden olmaz ? diye sorarsın diye yapıyı söyleyeyim sana --------
Server tarafı şöyle olsun
Users=Array(); io.on('connection'function(socket){ socket.emit('kimsin',""); socket.on('UserBilgileri',function(Data){ var Kontrol=false; for(var x in sockets) { if(Data.key==Users[x].key) { Kontrol=true; } } if(Kontrol) { //Kullanıcı Var SocketDeğiş } else{ ///Yeni Kullanıcı Ata. } }); });Client de şöyle
var Socket=io.connect("xxx.xx.xx.xx:xx"); Socket.on("Kimsin",function(){ Socket.emit("UserBilgileri",{ "Ad":"VelHasıl", "Yas":"1233" }); });Böyle Şimdi Ben giriş yaptım Bilgilerim mevcut socket'i değiştim Şuan index.php de olduğumu düşün.
Tarayıcıda yeni sekme actım Anasayfa.php actım
Sonra tekrar bi yeni sekme Mesajlar.php.
3 Sekmem mevcut şuan Şimdi Server'dan emit kodu gönderdim. Hangi Sekmeye düşecek ? Hepsine düşecek mi ? Hayır. Neden çünkü Socket bilgileri değişti adam aynı olsa bile. Eski socket gitti yeni socket geldi. Çünkü connection oldu.
Eski sekmelerden bi on kodu gönderdim. Eee noldu eski soketten veri gönderdiğim için Server Tarafında bu adamın eski socket bilgileri duruyor bu da kim ? Diye sormaz mı Server. Sorar çünkü adam kim olduğunu bilmiyor ... Gibi gibi... Yani şöyle olsa. Bir adet
var Socket=io.connection();
ve ben bu Socket denen illeti Bütün sayfalarda cağırabilsem.
Anasayfa,Mesajlar,index.php de de Socket aynı sonuçta. Emit de aynı socket On methodu da aynı socket içinde olacağı için Tüm browser de çalışacak... Ama nasıl olacak işte bu iş... Lanet Facebook nasıl yapıyor acaba. mantık ne. Aslında Session yada Cookie'ye Socket'imi atabilsem Ordan Sessionu tüm sayfalarda çağırıp çağırıp kullanırım. Bu Şuna benziyor.
Java da Bean diye bi class olsun yada Properties. Her neyse. Biz Bu Class'a Socket'i entegre ettiğimiz zaman static veririz. daha sonra bu static veriyi her class da aynı şekilde kullanmaya devam ederim... Ama Web tarafında nasıl olacak bu iş. Bi türlü çözemedim... Yani biz Java C# vs vs OOP programlama dillerinde bir değişkene tek bir sefer değer atadıktan sonra tüm projede o değişkeni kullanabiliyoruz ya. Heh işte bana bu lazım.
MhmdAlmz tarafından 23/Ağu/16 15:50 tarihinde düzenlenmiştir -
socket.id kullanma, onun yerine başka bir token kullan, c ookie olarak sakla, her yeni socket bağlantısında bunu doğrulat.
diyelim ki adam browserında 3 tane farklı sayfa açtı. bu senin için 3 farklı socket.id demek. bunları aynı odaya koyarsan (join), üçüne de aynı anda mesaj gönderebilirsin.
umarım sorununu tam olarak anlamışımdır..
Ek: co okie'ye soc ket.id ni atabilirsin. bunun için sunucu tarafından socket.id yi tespit edip, clien t'e emit et.
RockZs tarafından 23/Ağu/16 16:11 tarihinde düzenlenmiştir -
Aaa cidden Oda yaratmak olabilir her User için Giriş yaptığı tüm client'leri tek bir odaya toplayıp ordan bir komut geldiğinde bu odaya Emit ettirebilirim.. Mantıklı bu sayede sorun olmaz.... Tarayıcıda çalıştırmak yerine tüm socketleri Bağlantıları o user üzerine oda acıp o odaya verileri emit ettirmek olabilir. deneyeyim bir..
