Socket.io ile Online Kullanıcıları Listelemek

Fatalis

Megapat
Katılım
18 Ağustos 2014
Mesajlar
4.945
Makaleler
5
Çözümler
62
Daha fazla  
Cinsiyet
Erkek
Meslek
Web Tasarımcısı
NodeJS ile aram yok, daha önce ElectronJS ile ufak bir masaüstü yazılımı geliştirmiştim o kadar. Socket.io ile chat sistemi geliştirdim, sorunsuz çalışıyor ancak ben siteye üye girişi yapmış kullanıcılarının isimlerini listeletmek istiyorum. Bunu yapmak için nasıl bir mantık izlemem gerekli?
 
Son düzenleyen: Moderatör:
Gmail'deki gibi imleç ekrana geldiğinde sunucuya ping göndertebilirsin. Her 15 dakikada bu işlemi tekrarlayıp 15 dakika geçtiyse kullanıcıyı offline yapabilirsin.
 
Header gonderebilirsin socket IO header destekliyor.
Header icerisinde "isAuthenticated" gibi bir sey kullanma tabi, 2dk da hacklerler : )
Mevcut bagli kullanicilar arasindakilerin header bilgisini inceleyip kac tanesi giris yapmis kac tanesi yapmamis analiz edebilirsin gercek zamanli.
 
Tam adamına denk geldin :D
Gereken modüller express , socket.io ve express session:

JavaScript:
var express    = require('express');
const session = require("express-session");
var app = express();
var server = require('http').Server(app);
var sio = require('socket.io')(server);
var sessionmiddle=session({
  secret: "xxx",
  resave: false,
  saveUninitialized: true
});
app.use(sessionmiddle);


const nsp = sio.of('/oda');


//Burada express sessionu socket.io ile birlikte kullanabiliyoruz

sio.use(function(socket, next) {
sessionmiddle(socket.request, socket.request.res, next);
});


var kullanicilar=[];



nsp.on('connection', function(socket){


var nick=socket.request.session.nick;



kullanicilar.push(nick)

nsp.emit("kullanicilar",kullanicilar)



})

Diğer kodlara gerek yok diye düşündüm.
 
socket'in eventları var.

JavaScript:
const io = require("socket.io")
io.on("connection",socket=>{
    //bir kullanıcı bağlandığında çalışır.
   
    socket.on("disconnect",()=>{
        //kullanıcı çıktığında çalışır.
    })
})
ama eğer login gibi bir işlemin varsa on("connection") yerine login olunca data gönderebilirsin.
bu kodun çalışması için clientde var socket = io() dışında bir şey yapmak zorunda değilsin
 
socket'in eventları var.

JavaScript:
const io = require("socket.io")
io.on("connection",socket=>{
    //bir kullanıcı bağlandığında çalışır.
  
    socket.on("disconnect",()=>{
        //kullanıcı çıktığında çalışır.
    })
})
ama eğer login gibi bir işlemin varsa on("connection") yerine login olunca data gönderebilirsin.
bu kodun çalışması için clientde var socket = io() dışında bir şey yapmak zorunda değilsin
Siteye üye girişi yapmış diyor yani , hangi database kullanıyorsa oradan bilgi alıp sessiona aktarmadan nasıl yapacak?
 
Siteye üye girişi yapmış diyor yani , hangi database kullanıyorsa oradan bilgi alıp sessiona aktarmadan nasıl yapacak?
Benim demek istediğim şey şu.io.on("connection") yerine onun içinde client login olduğunda data gönderebilirsin.örnek:
client:
JavaScript:
var socket = io()

function onButtonClick() {
    if (input1.value && input2.value) {
        socket.emit("kontrol",{pass:input2.value,usr:input1.value})
    }
}
document.querySelector("button").onmousedown = onButtonClick

socket.on("passKontrol",(msg)=>{
    if (msg) {
        //parola yanlış
    }
    else {
        //parola doğru
    }
})
server:
JavaScript:
const io = require("socket.io")

io.on("connection",socket=>{
    socket.on("kontrol",(msg)=>{
        //kontrol işlemleri
        var passTrue;
        //passTrue'yu şifre doğru yada yanlışsa true yada false olarak değiştirebilirsin
        socket.emit("passKontrol",passTrue)
        if (passTrue) {
            //kullanıcı başarılı login yaptı
        }
    })
    socket.on("disconnect",()=>{
        //çıkış işlemi
    })
})
 
Bir yere kadar doğru ; fakat kullanıcı her connection istediğinde database ' e gitmek mantıklı mı ?
Neden dersen sayfasını yenilemesi bile tekrardan bir connection olayı.
 
Site tarafında kullanıcı logini başarılı olduğu zaman login olan kullanıcının ID'sini Socket sunucusuna gönderiyorum, daha sonra Socket sunucusunda ID'yi veritabanında kontrol ettiriyorum.

Daha önce oluşturduğum users adındaki obje içerisine kullanıcının bilgisini Socket ID'sine eşdeğer bir şekilde giriyorum.

{ "sa4dd4a6qw13fx17q64w" : "15" "s44d6wq4f1xwq67q6r1q" : "12" }

Tarzında, Socket ID : Kullanıcı ID'si şeklinde. Bu sayede disconnect işlemi gerçekleştiğinde disconnect olan Socket ID'sini object'den siliyorum. Objeyi PHP tarafına gönderiyorum PHP belirtilen ID'lere ait kullanıcı bilgilerini çekip online listesinde gösteriyor.

Tabii bunu unique olarak yapıyorum çünkü 2-3 farklı tarayıcıdan girerse kullanıcı 3 kere aynı isim gözükebilir. Objeye aynı ID'den 3 tane ekleneceği için, ben böyle bir çözüm buldum.
 
Bir yere kadar doğru ; fakat kullanıcı her connection istediğinde database ' e gitmek mantıklı mı ?
Neden dersen sayfasını yenilemesi bile tekrardan bir connection olayı.
Ben basit bir kod yazdım. Tabii ki haklısınız database konusunda. Ben olsam database'e girmek yerine bir obje ile olayı bitirirdim. Benim amacım ping yada header yerine bu yolu göstermekti. Kullanıma hazır bir kod yazmadım zaten ben.
 

Geri
Yukarı