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