Node.js is a badass rock star tech - II.rész

2014.04.02. | írta: kresshy

A Node.js cikksorozatunk következő részét olvashatjátok, melyben egy nagyon egyszerű chat programot fogunk elkészíteni. Az előző cikkben megismerkedhettünk egy-két alapvető fogalommal és a belső működéssel, most pedig ideje belevágnunk a programozós részbe. Még mielőtt nagyon belelendülnénk elárulom, hogy a következő cikk az Express.js-ről fog szólni, de ne szaladjunk ennyire előre lássuk azt a chat programot.

chatting with yourself is so much fun

Nézzünk egy nagyon egyszerű kódrészletet, ami annyiból áll, hogy készítünk egy TCP szervert és várjuk, hogy becsatlakozzanak rá. A kapott adatokat egyszerűen csak kiírjuk a console-ra.

var net = require('net');

var chatServer = net.createServer();

chatServer.on('connection', function(client) {

    client.write('Hi\n');

    client.on('data', function(data) {
        console.log(data);
    });
});

chatServer.listen(1337);

Vegyük sorban a fontos részeket. Az első a require(id) függvény, ahol az id egy String. A require függvény segítségével modulokat tudunk betölteni. Ez ahhoz hasonló, mint Javaban az import vagy c-ben az #include. Jelen esetben a net modulra van szükségünk. Ennek a segítségével tudunk szerver, illetve kliens oldali streameket is létrehozni.

A chatServer.createServer() függvénnyel hozzuk létre az új szervert. Ez igazából csak egy wrapper a net.Socket osztály köré, hogy sokkal könnyebben tudjuk kezelni a socketet.

A következő fontos függvény az on(event, listener). Ennek segítségével tudunk feliratkozni eseményekre. Jelen esetben a chatServer connection eseményre iratkozunk fel. Az esemény figyelőnk, vagyis a listener az a függvény lesz, amit megadunk argumentumként function(client). Fontos, hogy itt a client egy streamet jelent, amin keresztül tudunk olvasni, illetve írni.

A write(string) függvénnyel tudunk írni a streamre, viszont az olvasáshoz újabb eseményre kell feliratkozni, mégpedig a data nevű eseményre. Ezt ismételten az on(event, listener) függvénnyel tudjuk megtenni. Az utolsó fontos dolog pedig a listen(port) függvény meghívása, amivel megmondhatjuk melyik porton hallgatózzon a szerver.

Eddig nem volt túl bonyolult, de még nem tudnak a felhasználók írni egymásnak. Ehhez el kell tároljuk a csatlakozott streameket és mindegyikre ki kell írni a bejövő adatot, kivéve arra, amelyikről jön az adat. Egészítsük ki a kódunkat, hogy mindez teljesüljön.

// ebben tároljuk a streameket
var clients = [];

var chatServer = net.createServer();
chatServer.on('connection', function(client) {

    // nehany adat a bekapcsolodo felhasznalorol
    client.name = client.remoteAddress + ':' + client.remotePort;    

    // eltaroljuk a becsatlakozott streamet
    clients.push(client);

    client.on('data', function(data) {
        broadcastMessage(data, client);
    });    
});

function broadcastMessage(message, client) {
    for (var i = 0; i < clients.length; i++) {
        if (client !== clients[i]) {
            clients[i].write(client.name + 'says' + message);
        }
    }
}

A megvalósítás most se túl bonyolult. Eltároljuk a becsatlakozott felhasználót a clients tömbben, majd ha valaki ír a streamre, akkor mindegyik kapcsolat streamjére kiírjuk az adatot amit kaptunk. Innentől működik a chat programunk. Ha szeretnénk tesztelni, akkor csak simán kapcsolódjunk a megfelelő portra párszor és kezdjünk el irkálni magunknak. A program természetesen tovább finomítható különböző eseményekre történő feliratkozással.

Az egyik ilyen az end esemény amiben ha a kapcsolatot bontják, akkor kapunk egy figyelmeztetést és a callback függvényünkben kezelhetjük a dolgokat. Például ha szeretnénk egy kapcsolatot kivenni a listánkból akkor ki tudjuk szedni a tömbből a splice() függvénnyel: clients.splice(clients.indexOf(client), 1);.

A másik hasznos esemény az error. Ha a kapcsolat megszakad és írni szeretnénk a streamre, akkor nem fogunk tudni mert már nem létezik. Egy errort kapunk és fel tudunk készülni erre az eseményre. Ezt megelőzhető, a kapcsolatok vizsgálhatók, hogy írhatók-e. A writeable tulajdonságot lekérdezve ezt könnyedén ellenőrizhetjük egy feltételként is: if (clients[i].writeable) ....

Remélem tetszett ez a kis tutorial. A sorozat következő részében már egy webes keretrendszert fogunk megnézni, amit a PÉK front-end újraírásakor is használni fogunk. Ha érdekel, akkor a továbbiakban is tartsatok velünk!

Források: Node - Up and Running Node.js Manual & Documentation

Facebook Twitter Google+
comments powered by Disqus