t3n 29

Node.js: Das JavaScript-Framework im Überblick

Seite 2 / 3

Websockets

In traditionellen Web-Applikationen antwortet der Server nur auf Anfrage des Clients. Es existiert kein Rückkanal, also keine Möglichkeit für den Server, den Client zu erreichen, falls sich Daten auf Serverseite verändert haben. Große Plattformen wie Facebook und Twitter leben jedoch von der Echtzeit-Interaktion der Nutzer. Dadurch entsteht die Notwendigkeit, neue Daten an verschiedene Clients auszuliefern, die die Darstellung der Daten im Idealfall partiell aktualisieren und so die Veränderungen widerspiegeln.

HTML5 standardisiert neben reinen HTML-Tags eine Reihe von Technologien, mit deren Hilfe die Anforderungen moderner Web-Applikationen besser erfüllt werden können. Im Fall der bidirektionalen Kommunikation zwischen Client und Server sind dies sogenannte Websockets [2], ein auf TCP aufbauendes Protokoll.

Bis alle gängigen Browser die für Node.js benötigten Websockets unterstützen, bietet sich die Socket.io-Bibliothek zur Überbrückung an.
Bis alle gängigen Browser die für Node.js benötigten Websockets unterstützen, bietet sich die Socket.io-Bibliothek zur Überbrückung an.

Das Protokoll operiert auf der gleichen Ebene wie HTTP. Der größte Unterschied zu HTTP liegt aber darin, dass es sich bei einem Websocket um eine permanente Verbindung handelt, über die sowohl der Client als auch der Server Daten schicken kann.

Problematisch ist dabei lediglich, dass diese Technologie nicht von allen Browsern unterstützt wird. Microsofts Internet Explorer etwa unterstützt das Websocket-Protokoll erst ab der nächsten Version (10). Bis es soweit ist, lässt sich das Protokoll mittels Bibliothek abstrahieren: Socket.io [3] ist komplett in JavaScript implementiert und steht sowohl auf Serverseite als auch auf Clientseite zur Verfügung. Unterstützt ein Browser keine Websockets, existiert ein Fallback auf Long Polling, Flashsockets und andere Technologien.

Installation von Socket.io

$ npm install socket.io

Listing 1

Um Socket.io in Verbindung mit Node.js verwenden zu können, muss das entsprechende Paket installiert sein. Node.js bietet hierfür den Node Package Manager (NPM) [4] an, mit dessen Hilfe sich einfach zusätzliche Module installieren lassen. Die wichtigsten Optionen für NPM sind entsprechend „install“ und „remove“, um Pakete zu installieren und wieder zu entfernen, sowie „list“, um die installierten Pakete samt Abhängigkeiten aufzulisten.

Node.js Socket Server

var io = require('socket.io').listen(1337);
io.sockets.on('connection', function (socket) {
    socket.on('message', function (data) {
        // do something
    });
});

Listing 2

Listing 2 zeigt, wie einfach ein vollständiger Socket-Server in Node.js aussieht. Prinzipiell wird der Server in drei Schritten erstellt. Zuerst wird das Socket.io-Modul mittels „require“ eingebunden und mit einem TCP-Port versehen, über den die Kommunikation erfolgt. Das Socket.io-Objekt, das dieser Aufruf zurückgibt, dient im weiteren Programmablauf dazu, das Verhalten des Servers festzulegen. Im nächsten Schritt definiert die Methode „on('connection', ...)“ was passiert, sobald sich ein Client mit dem Server verbindet. Innerhalb der Callback-Funktion (zweiter Parameter) wird wiederum mittels „on“-Methode durch ein Callback festgelegt, was beim Eintreten bestimmter Ereignisse (im Beispiel beim Eintreffen einer Nachricht) auf dem Socket passieren soll.

Auf Serverseite besteht die Möglichkeit, über die „emit“-Methode Nachrichten über die Socket-Verbindung an den Client zu schicken. Dazu werden der Typ der Nachricht und weitere Daten angegeben, die die Nachricht spezifizieren.

Nachrichten über eine Socket-Verbindung senden

socket.emit('hello', { result: 'hello world' });

Listing 3

Wichtig dabei ist, dass „emit“ lediglich einen Client anspricht. Obwohl oft eine Point-to-Point-Kommunikation erwünscht ist, gibt es immer wieder Fälle, in denen an alle verbundenen Sockets oder eine bestimmte Gruppe von Sockets gesendet werden soll. Um alle Sockets zu erreichen, existiert die Methode „broadcast“ im Socket-Objekt, die wiederum die „emit“-Methode implementiert.

Eine Möglichkeit, um die größtmögliche Kontrolle über die verfügbaren Sockets zu erlangen, ist die Speicherung der Socket-Handles in einer Hashmap. Als Gruppierung der Sockets ermöglicht sie eine sehr feine Steuerung, auf welchen Socket zu welcher Gelegenheit welche Nachricht geschickt werden soll.

Wenn über die bestehende Socket-Verbindung persönliche Daten ausgetauscht werden, die für Dritte nicht einsehbar sein sollen, lässt sich von unverschlüsselten Websockets auf die sichere, verschlüsselte Variante zurückgreifen. Standardmäßig wird für Websockets das Protokollpräfix „ws://“ verwendet, bei der sicheren Variante „wss://“. Für eine explizit verschlüsselte Verbindung dient auf Clientseite einerseits das Präfix „https://“ in der „connect“-Methode, andererseits die Option „secure: true“.

Sichere Websocket-Verbindung

var socket = io.connect('https://example.com:1337', { secure: true });

Listing 4

Bitte beachte unsere Community-Richtlinien

6 Reaktionen
areanet

Wer mehr über die technische Umsetzung von node.js und Co. erfahren will, für den haben wir ein fünfteiliges Tutorial zum Thema "Entwicklung einer Echzeit-Multiscreen-App" in unserem Blog zusammengestellt: http://www.app-agentur-bw.de/blog/multiscreen-tutorial-chat-mit-websockets-teil-1-einfuehrung

asmuelle

Ich habe zur Zeit 5 Webapplikationen im Einsatz, die skalieren deutlich besser als ihre Tomcat Vorgänger und sind sehr stabil.

nazeK

Node.js ist defintiv ausgereift. Die vielen Änderungen der Funktionen und Methoden (und damit auch der Dokumentation), sind seit Ende letzten Jahres m.M.n. nicht mehr das Problem. Natürlich muss, im Gegensatz zu PHP oder Ruby, der Code zur Zeit noch regelmäßig auf die Funktionalität geprüft werden (wenn man Node.js aktualisiert), da nicht unbedingt eine 100%ige Abwärtskompatibilität gegeben sein muss. Aber es ist nicht mehr so dramatisch wie vor einem Jahr.

Node.js ist eine sehr attraktive Alternative (ja, Alternative) zu Ruby, PHP und co. Applikationen wie Calipso zeigen eindrucksvoll, was wirklich mit Node.js machbar ist. Ich bin gegenwärtig am überlegen, warum man noch bei PHP bleiben sollte. Besonders bei Anwendungen die höherer Last ausgesetzt sind und wo man auch nur eine Anwendung auf einem Host betreibt, gebe ich Node.js den Vorzug. Für multi-node.js-Umgebungen (also Server auf denen mehrere Instanzen bzw. Anwendungen laufen), habe ich bisher noch nicht das Tool gefunden, welches das Organisieren ebendieser Anwendungen bequem ermöglicht (es gibt einige Tools, bisher aber noch nicht so bequem, dass Lieschen Müller damit umgehen könnte). Da bleiben Ruby und PHP *noch* erste Wahl. Ich kann mir aber vorstellen, dass sich dies bald ändern könnte.

Was natürlich auch beachtet werden muss, ist die Schwerfälligkeit der Using-Community. Also jener Webmaster, Hoster und IT-Anbieter, die später Node.js einsetzten müssten. Das Beispiel Nginx zeigt ja, dass bessere Software nicht unbedingt ein Argument für einen Umstieg ist. Anders kann man die herrschende Dominanz von Apachewebservern nicht erklären. Ähnlich kann/wird es wohl auch Node.js gehen. Ein Tool für Nerds, Geeks & Enterprise-Entwickler.

Lars Budde

@Pascal Der Artikel stammt aus dem t3n-Magazin Nr. 29. Die Erstveröffentlichung war - wie du oben nachlesen kannst - am 28.08.2012. Möglicherweise erklärt das die fehlende Aktualität, die du bemängelst.

Pascal192

Der Post ist doch an mehreren Stellen schon nicht mehr aktuell...

Seyreb

Frühes Entwicklungsstadium?
Was hat das mit dem Versionierungschema zu tun?
Node.js ommt auf jeder menge Seiten zum Einsatz, und das teilweie schon seit Jahren!
Habt ihr andere Artikel genauso schlecht recherchiert?

Du musst angemeldet sein, um einen Kommentar schreiben zu können.

Jetzt anmelden

Hey du! Schön, dass du hier bist. 😊

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team bestehend aus 65 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Danke für deine Unterstützung.

Digitales High Five,
Stephan Dörner (Chefredakteur t3n.de) & das gesamte t3n-Team

Anleitung zur Deaktivierung