folder Tahribat.com Forumları
linefolder Html - CSS - XML - JavaScript - Ajax
linefolder 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

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PHP-SEO Developer
    Erdem
    Erdem's avatar
    Kayıt Tarihi: 04/Haziran/2002
    Erkek

    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 :)

     

     


    Php for SEO....
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    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ı..

     

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PHP-SEO Developer
    Erdem
    Erdem's avatar
    Kayıt Tarihi: 04/Haziran/2002
    Erkek

    ü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


    Php for SEO....
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    detCode
    detCode's avatar
    Kayıt Tarihi: 30/Kasım/2012
    Erkek

    ş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önderebilirsin

     

    ayrı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

    Who is detCode?
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Elif - Efe
    rakkoc
    rakkoc's avatar
    Kayıt Tarihi: 19/Aralık/2003
    Homo

    ben benzer bir seyi C++ ile yapmak zorunda kaldiydim, acilan soketleri handlerlarini tutuyordum, sonra o handla sadace yolluyordum gelen veri p2p olacak ise.


    Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. || Kişisel : Http://blog.rakkoc.com // Kurumsal : http://www.Yoroca.com
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Böcüklerin Efendisi
    krypt
    krypt's avatar
    Kayıt Tarihi: 05/Mart/2004
    Erkek

    var clientlist {};

    io.sockets.on('connection', function(socket) {

        clientlist[socket.id] = socket;

    }

     

    Böyle her client'i bir objede tutarak halledemez misin?

     

     

     

    krypt tarafından 11/Mar/14 09:35 tarihinde düzenlenmiştir

    while (1<2)
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    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.


    No. Not even in the face of Armageddon. Never compromise. - Walter Kovacs (Rorschach)
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PHP-SEO Developer
    Erdem
    Erdem's avatar
    Kayıt Tarihi: 04/Haziran/2002
    Erkek

    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.


    Php for SEO....
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    detCode
    detCode's avatar
    Kayıt Tarihi: 30/Kasım/2012
    Erkek

    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
    }
    });

     

    detCode tarafından 11/Mar/14 15:15 tarihinde düzenlenmiştir

    Who is detCode?
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ★★★★
    Genki
    Genki's avatar
    Kayıt Tarihi: 24/Ağustos/2005
    Erkek
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PHP-SEO Developer
    Erdem
    Erdem's avatar
    Kayıt Tarihi: 04/Haziran/2002
    Erkek

    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

    Php for SEO....
Toplam Hit: 1764 Toplam Mesaj: 11