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

2014. április 2.

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

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 RunningNode.js Manual & Documentation