dummies
 
 

Suchen und Finden

Titel

Autor/Verlag

Inhaltsverzeichnis

Nur ebooks mit Firmenlizenz anzeigen:

 

Einführung in Node.JS

von: Tom Hughes-Croucher, Mike Wilson

O'Reilly Verlag, 2013

ISBN: 9783868997996 , 216 Seiten

Format: PDF, ePUB, OL

Kopierschutz: frei

Windows PC,Mac OSX geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Apple iPod touch, iPhone und Android Smartphones Online-Lesen für: Windows PC,Mac OSX,Linux

Preis: 8,99 EUR

Exemplaranzahl:  Preisstaffel

Für Firmen: Nutzung über Internet und Intranet (ab 2 Exemplaren) freigegeben

Derzeit können über den Shop maximal 500 Exemplare bestellt werden. Benötigen Sie mehr Exemplare, nehmen Sie bitte Kontakt mit uns auf.


Mehr zum Inhalt

Einführung in Node.JS


 

Kapitel 2. Kleine Projekte zum Start


Die Programmiertrends der letzten Jahre haben dafür gesorgt, dass es immer leichter wurde, immer komplexere Anwendungen zu schreiben. Es ist wichtig, dass wir eines nicht vergessen: Node konzentriert sich vor allem auf das Bauen von Netzwerk-Anwendungen – also Programmen mit viel Ein- und Ausgabe (Input/Output, I/O). Lassen Sie uns ein paar I/O-lastige Apps bauen und sehen, wie einfach sich das mit Node realisieren lässt – bei immer noch vorhandener Skalierbarkeit.

Einen Chatserver bauen


In einer Welt, die zunehmend auf eine Kommunikation in Echtzeit setzt, ist ein Chat genau das Richtige. Wo beginnen wir? Lassen Sie uns mit einem TCP-basierten Chatserver beginnen, mit dem wir uns per Telnet verbinden können. Das ist nicht nur ein einfaches Programm als Ausgangspunkt, wir können den Server auch noch vollständig in Node schreiben.

Als Erstes müssen wir die TCP-Bibliotheken von Node einbinden und einen neuen TCP-Server erstellen (siehe Listing 2.1).

var net = require('net') var chatServer = net.createServer() chatServer.on('connection', function(client) { client.write('Hallo!\n'); client.write('Tschüss!\n'); client.end() }) chatServer.listen(9000)

Listing 2.1 Einen neuen TCP-Server erstellen

Der erste Schritt ist das Einbinden des net-Moduls. Dieses Modul enthält den gesamten TCP-Kram für Node. Danach können wir einen TCP-Server erstellen, indem wir die Methode net.createServer() aufrufen. Nachdem wir einen Server zum Leben erweckt haben, wollen wir auch, dass er etwas tut. Wir fügen also mit der Methode on() einen Event Listener hinzu. Immer dann, wenn das connection-Event eintritt, ruft der Event Listener die übergebene Funktion auf. Ein connection-Event wird dann geworfen, wenn sich ein neuer Client mit dem Server verbindet.

Das connection-Event übergibt uns beim Aufruf unserer Callback-Funktion eine Referenz auf den TCP-Socket für unseren neuen Client. Dieser Referenz haben wir den Namen client gegeben. Durch den Aufruf von client.write() können wir Nachrichten an den neu verbundenen Client senden. Zum Ausprobieren sagen wir nur »Hallo!« und »Tschüss!« und rufen dann die Methode client.end() auf, um die Verbindung zu schließen. Das Ganze ist sehr einfach, aber es soll auch nur als Ausgangspunkt für unseren Chatserver dienen. Schließlich müssen wir listen() aufrufen, so dass Node weiß, an welchem Port es lauschen soll. Lassen Sie uns das nun einmal ausprobieren.

Wir können unseren neuen Server testen, indem wir uns mit einem Telnet-Programm bei ihm anmelden. Dieses ist auf den meisten Betriebssystemen installiert.[2] Als Erstes müssen wir unseren Server starten, indem wir node mit dem Dateinamen aufrufen. Dann können wir uns verbinden, indem wir eine Telnet-Verbindung zu localhost auf Port 9000 aufbauen – wie wir es in unserem Node-Programm angegeben haben (siehe Listing 2.2).

Konsolen-Fenster 1 ------------------ Enki:~ $ node chat.js Konsolen-Fenster 2 ------------------ Last login: Tue Jun 7 20:35:14 on ttys000 Enki:~ $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hallo! Tschüss! Connection closed by foreign host. Enki:~ $

Listing 2.2 Per Telnet einen Node-TCP-Server ansprechen

Bisher haben wir einen Server erstellt, mit dem sich Clients verbinden können, und wir haben diesen eine Nachricht geschickt, bevor wir sie wieder hinauswerfen. Ein Chatserver ist das aber nicht. Lassen Sie uns ein paar Dinge hinzufügen. Wir sollten z. B. sicherstellen, dass wir Nachrichten von Clients erhalten können (siehe Listing 2.3).

var net = require('net') var chatServer = net.createServer() chatServer.on('connection', function(client) { client.write('Hallo!\n'); client.on('data', function(data) { console.log(data) }) }) chatServer.listen(9000)

Listing 2.3 Auf jede Verbindung lauschen

Hier haben wir einen weiteren Event Listener hinzugefügt, dieses Mal client.on(). Beachten Sie, wie wir den Event Listener im Gültigkeitsbereich der Callback-Funktion für connection definiert haben. Dadurch haben wir Zugriff auf den client, der dem Event mitgegeben wird. Der neue Listener ist für ein Event namens data gedacht. Dieses Event wird immer dann ausgelöst, wenn client Daten an den Server schickt. Wir mussten allerdings client.end() rausschmeißen. Würden wir die Verbindung zum Client schließen, könnten wir ja nicht mehr auf neue Daten lauschen. Jetzt werden Daten, die an den Server geschickt werden, immer an der Konsole ausgegeben. Lassen Sie uns das in Listing 2.4 ausprobieren.

Konsole 1 ------------- Enki:~ $ node chat.js Konsole 2 ------------ Enki:~ $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hallo! Selber Hallo

Listing 2.4 Daten per Telnet an den Server schicken

Was ist hier geschehen? Wir haben den Server gestartet und uns per Telnet mit ihm verbunden. Der Server hat »Hallo!« gesagt und wir haben mit »Selber Hallo« geantwortet. Daraufhin hat Node eine Menge seltsamer Werte in einem Datentyp ausgegeben, den Sie noch nie gesehen haben. Da JavaScript nicht gut mit Binärdaten umgehen kann, hat Node hier nachgebessert. Der Datentyp heißt Buffer und mit ihm kann der Server Binärdaten darstellen. Node weiß nicht, was für Daten Telnet geschickt hat, daher speichert es die Daten erst einmal binär, bis wir nach einer anderen Art von Kodierung fragen. Die Darstellung der Zeichen und Ziffern erfolgt schlicht in Bytes und in hexadezimaler Form (siehe auch „Buffer“ in Kapitel 4). Jedes Byte repräsentiert eines der Zeichen im String »Selber Hallo«. Wir können die Methode toString() nutzen, um Buffer-Daten in einen normalen String umzuwandeln, oder wir geben die Daten einfach so aus, weil TCP und Telnet dies beide problemlos verstehen.

Nachdem wir nun Nachrichten von jedem Client erhalten, sollten sie sich gegenseitig Nachrichten schicken können. Dazu müssen wir einen Weg finden, wie sie untereinander kommunizieren. Es ist zwar schön, dass wir client.write() aufrufen können, aber das funktioniert immer nur für einen Client gleichzeitig. Wir brauchen einen Weg, andere Clients ansprechen zu können. Dazu erstellen wir eine Liste mit Clients, für die Daten geschrieben werden können sollen. Immer wenn wir einen neuen Client erhalten, fügen wir ihn unserer Liste hinzu und nutzen diese dann, um zwischen den Clients eine Kommunikation herzustellen (siehe Listing 2.5).

var net = require('net') var chatServer = net.createServer(), clientList = [] chatServer.on('connection', function(client) { client.write('Hallo!\n'); clientList.push(client) client.on('data', function(data) { for(var i=0;i

Listing 2.5 Zwischen Clients kommunizieren

Wenn wir dazu wie in Listing 2.6 vorgehen, können wir uns über mehrere Clients mit dem Server verbinden, damit sie sich untereinander Nachrichten zukommen lassen können.

Konsole 1 ------------ Enki:~ $ node chat.js Konsole 2 ------------ Enki:~ $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hallo! Selber Hallo Selber Hallo Konsole 3 ------------ Enki:~ $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hallo! Selber Hallo

Listing 2.6 Nachrichten zwischen Clients verschicken

Dieses Mal protokolliert der Server die eintreffenden Nachrichten nicht, stattdessen durchlaufen wir das Array und schicken sie zurück an die Clients. Beachten Sie, dass eine Nachricht, die von Terminal 2 gesendet wurde, zum Telnet-Client von Terminal 3 geschickt wird, aber auch zurück an Terminal 2 geleitet wird. Denn wenn wir die Nachricht versenden, prüfen wir nicht, wer der Absender war – wir verschicken sie einfach an alle Clients. Man kann zudem im...