1 / 25
node.js
Serverseitiges JavaScript für skalierbare
Netzwerkanwendungen
Benjamin Erb
31. Mai 2010
2 / 25
KURZE PERSÖNLICHE VORSTELLUNG
I Student der Medieninformatik (Uni Ulm)
I Interessenschwerpunkte
I Verteilte Systeme
I Ubiquitous Computing
I Web-Technologien
2 / 25
KURZE PERSÖNLICHE VORSTELLUNG
I Student der Medieninformatik (Uni Ulm)
I Interessenschwerpunkte
I Verteilte Systeme
I Ubiquitous Computing
I Web-Technologien
3 / 25
NODE.JS
Node’s goal is to provide an easy way to
build scalable network programs.
Almost no function in Node directly performs
I/O, so the process never blocks.
Quelle: http://nodejs.org/#about
3 / 25
NODE.JS
Node’s goal is to provide an easy way to
build scalable network programs.
Almost no function in Node directly performs
I/O, so the process never blocks.
Quelle: http://nodejs.org/#about
4 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
SQL-Abfrage unter Java:
1 Statement s = conn.createStatement();
2 s.executeQuery("SELECT id FROM users");
3 ResultSet rs = s.getResultSet();
4 //Resultat verwenden
I Operation blockiertI evtl. Multithreading
4 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
SQL-Abfrage unter Java:
1 Statement s = conn.createStatement();
2 s.executeQuery("SELECT id FROM users");
3 ResultSet rs = s.getResultSet();
4 //Resultat verwenden
I Operation blockiert
I evtl. Multithreading
4 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
SQL-Abfrage unter Java:
1 Statement s = conn.createStatement();
2 s.executeQuery("SELECT id FROM users");
3 ResultSet rs = s.getResultSet();
4 //Resultat verwenden
I Operation blockiertI evtl. Multithreading
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
5 / 25
MOTIVATION: BLOCKIERENDE AUFRUFE
I blockierende Aufrufe verschenken CPU-Cycles
I I/O RAM: 250 Cycles
I I/O Festplatte: 41.000.000 Cycles
I I/O Netzwerk: 240.000.000 Cycles
I Multithreading
I Kontextwechsel kosten ebenfalls Cycles
I Execution Stacks verbrauchen Speicher
I extrem anspruchsvoll korrekt zu implementieren
6 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
Abfrage in Node.js (Pseudo-Aufruf):
1 db.executeStatement("SELECT id FROM users", function(resultSet){
2 //Resultat verwenden
3 });
4 //...
I Aufruf blockiert nichtI Callbackfunktion als ParameterI Ausführung des Callbacks bei Beendigung der
Operation
6 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
Abfrage in Node.js (Pseudo-Aufruf):
1 db.executeStatement("SELECT id FROM users", function(resultSet){
2 //Resultat verwenden
3 });
4 //...
I Aufruf blockiert nicht
I Callbackfunktion als ParameterI Ausführung des Callbacks bei Beendigung der
Operation
6 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
Abfrage in Node.js (Pseudo-Aufruf):
1 db.executeStatement("SELECT id FROM users", function(resultSet){
2 //Resultat verwenden
3 });
4 //...
I Aufruf blockiert nichtI Callbackfunktion als Parameter
I Ausführung des Callbacks bei Beendigung derOperation
6 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
Abfrage in Node.js (Pseudo-Aufruf):
1 db.executeStatement("SELECT id FROM users", function(resultSet){
2 //Resultat verwenden
3 });
4 //...
I Aufruf blockiert nichtI Callbackfunktion als ParameterI Ausführung des Callbacks bei Beendigung der
Operation
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
7 / 25
MOTIVATION: NICHT-BLOCKIERENDE AUFRUFE
I Bibliotheken für nicht-blockierende Aufrufe
I Java: java.nio
I Perl: IO::AIO
I . . .
I Probleme
I Vorbehalte von Entwicklern
I anderes Programmiermodell
I geringe Verfügbarkeit von Bibliotheken
8 / 25
NODE.JS — ÜBERBLICK
I JavaScript
I Asynchrone I/O Operationen
I Eventbasiert / Eventloop
I API für Datei-, Netzwerkoperationen, HTTP, etc.
8 / 25
NODE.JS — ÜBERBLICK
I JavaScript
I Asynchrone I/O Operationen
I Eventbasiert / Eventloop
I API für Datei-, Netzwerkoperationen, HTTP, etc.
8 / 25
NODE.JS — ÜBERBLICK
I JavaScript
I Asynchrone I/O Operationen
I Eventbasiert / Eventloop
I API für Datei-, Netzwerkoperationen, HTTP, etc.
8 / 25
NODE.JS — ÜBERBLICK
I JavaScript
I Asynchrone I/O Operationen
I Eventbasiert / Eventloop
I API für Datei-, Netzwerkoperationen, HTTP, etc.
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
9 / 25
WIESO ÜBERHAUPT JAVASCRIPT?
I interessante Sprachkonstrukte
I anonyme Funktionen
I Closures
I Funktionen als Variablen
I JavaScript unterstützt intrinsisch event-basierte
Programmierung
I vgl. client-seitiges AJAX
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
10 / 25
JAVASCRIPT IN NODE.JS
I serverseitiges(!) JavaScript
I z.B. kein window Objekt
I Node.js nutzt intern Google v8
I JavaScript Engine, u.a. für Chrome Webbrowser
I Übersetzung in nativen Maschinencode
I Garbage Collection, Inline Caching, etc.
I ECMAScript 5
I z.T. CommonJS Standards wie Modules
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
11 / 25
NODE.JS API
I HTTP
I Client/Server
I HTTP Parser
I Filesystem
I Asynchrone Wrapper um POSIX Funktionen
I Read/Write Streams
I TCP, Crypto, DNS, Processes, Sys, Timers, etc.
12 / 25
HELLO WORLD WEBSERVER IN NODE.JS
hello.js
1 var http = require(’http’);
2
3 http.createServer(function (request, response) {
4 response.writeHead(200, {’Content-Type’: ’text/plain’});
5 response.end(’Hello World\n’);
6 }).listen(8000);
12 / 25
HELLO WORLD WEBSERVER IN NODE.JS
hello.js
1 var http = require(’http’);
2
3 http.createServer(function (request, response) {
4 response.writeHead(200, {’Content-Type’: ’text/plain’});
5 response.end(’Hello World\n’);
6 }).listen(8000);
$ node hello.js &
12 / 25
HELLO WORLD WEBSERVER IN NODE.JS
hello.js
1 var http = require(’http’);
2
3 http.createServer(function (request, response) {
4 response.writeHead(200, {’Content-Type’: ’text/plain’});
5 response.end(’Hello World\n’);
6 }).listen(8000);
$ node hello.js &
$ curl http://localhost:8000/
13 / 25
HELLO WORLD WEBSERVER MIT VERZÖGERUNG IN NODE.JS
delayedhello.js
1 var http = require(’http’);
2
3 http.createServer(function (request, response) {
4 setTimeout(function () {
5 response.writeHead(200, {’Content-Type’: ’text/plain’});
6 response.end(’Hello World\n’);
7 }, 2000);
8 }).listen(8000);
14 / 25
ABFRAGE VON DATEIINFORMATIONEN
stat.js
1 var http = require(’http’), fs = require(’fs’), url = require(’url’);
2
3 http.createServer(function (request, response) {
4 fs.stat(url.parse(request.url).pathname, function(err, stats){
5 if(!err){
6 response.writeHead(200, {’Content-Type’: ’application/json’});
7 response.end(JSON.stringify(stats));
8 }else{
9 response.writeHead(500, {’Content-Type’: ’application/json’});
10 response.end(JSON.stringify(err));
11 }
12 });
13 }).listen(8001);
15 / 25
ABFRAGE VON DATEIINFORMATIONEN (2)
$ curl http://localhost:8001/dev/null
{
"dev":14,
...
"atime":"2010-05-30T08:01:32.000Z",
"mtime":"2010-05-30T08:01:32.000Z",
"ctime":"2010-05-30T08:01:32.000Z"
}
$ curl http://localhost:8001/dev/nullx
{
"message":"ENOENT, No such file or directory ’/dev/nullx’",
"stack":"Error: ENOENT, No such file or directory ’/dev/nullx’\n ...
"errno":2,
"path":"/dev/nullx"
}
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
16 / 25
EINSATZSZENARIEN
I Web
I Real Time Web
I Webservices (z.B. REST + JSON)
I C10k Szenarien
I . . .
I Netzwerkanwendungen
I Rapid Prototyping
I . . .
17 / 25
STATUS
I definitiv beta
I aktuelle Version: 0.1.97 (29.05.2010)
I noch häufige API Änderungen
17 / 25
STATUS
I definitiv beta
I aktuelle Version: 0.1.97 (29.05.2010)
I noch häufige API Änderungen
17 / 25
STATUS
I definitiv beta
I aktuelle Version: 0.1.97 (29.05.2010)
I noch häufige API Änderungen
18 / 25
LANGFRISTIGE ZIELE
I API Freeze
I Unterstützung für Nebenläufigkeit
I Web Worker/Web Worker-ähnliche API
I Kommunikation zwischen Node Prozessen
I Auslagerung von CPU-gewichtigen Aufgaben
I jedoch kein Multithreading wie bei Java(!)
18 / 25
LANGFRISTIGE ZIELE
I API Freeze
I Unterstützung für Nebenläufigkeit
I Web Worker/Web Worker-ähnliche API
I Kommunikation zwischen Node Prozessen
I Auslagerung von CPU-gewichtigen Aufgaben
I jedoch kein Multithreading wie bei Java(!)
19 / 25
MODULE
I aktive Community um Module
I verschiedenste Bereiche
I Datenbank-Konnektoren, Datenbanken
I (Micro-)Frameworks, Router, Template-Engines
I Library-Bindings für XML, gd, . . .
I Debugging, Testing
I Paketverwaltungen
I . . .
19 / 25
MODULE
I aktive Community um Module
I verschiedenste Bereiche
I Datenbank-Konnektoren, Datenbanken
I (Micro-)Frameworks, Router, Template-Engines
I Library-Bindings für XML, gd, . . .
I Debugging, Testing
I Paketverwaltungen
I . . .
20 / 25
LINKS
I http://nodejs.org/
I http://wiki.github.com/ry/node/modules
I http://howtonode.org/
I #node.js auf irc.freenode.net
I http://groups.google.com/group/nodejs
21 / 25
FRAGEN
Vielen Dank für die Aufmerksamkeit.
Noch Fragen?
22 / 25
KONTAKT
I www.benjamin-erb.de
I twitter.com/b_erb
I www.ioexception.de
23 / 25
BEISPIEL: HTTP CHAT VON FELIX GEISENDÖRFER
Quelle: http://blog.debuggable.com/posts/javascript-meetup-hamburg-slides:4b8f9986-4e64-4755-b420-074dcbdd56cb
1 var
2 http = require(’http’),
3 messages = [];
4 http.createServer(function(req, res) {
5 res.writeHeader(200, {’Content-Type’ : ’text/plain’});
6 if (req.url == ’/’) {
7 res.write(messages.join("\n"));
8 } else if (req.url !== ’/favicon.ico’) {
9 messages.push(decodeURIComponent(req.url.substr(1)));
10 res.write(’ok!’);
11 }
12 res.close();
13 }).listen(4000);
24 / 25
BEISPIEL: HTTP PROXY VON PETERIS KRUMINS
Quelle: http://www.catonmat.net/http-proxy-in-nodejs
1 var http = require(’http’);
2
3 http.createServer(function(request, response) {
4 var proxy = http.createClient(80, request.headers[’host’])
5 var proxy_request = proxy.request(request.method, request.url, request.headers);
6 proxy_request.addListener(’response’, function (proxy_response) {
7 proxy_response.addListener(’data’, function(chunk) {
8 response.write(chunk);
9 });
10 proxy_response.addListener(’end’, function() {
11 response.end();
12 });
13 response.writeHead(proxy_response.statusCode, proxy_response.headers);
14 });
15 request.addListener(’data’, function(chunk) {
16 proxy_request.write(chunk);
17 });
18 request.addListener(’end’, function() {
19 proxy_request.end();
20 });
21 }).listen(8080);
25 / 25
BEISPIEL: TCP ECHO SERVER
Quelle: http://nodejs.org
1 var tcp = require(’tcp’);
2 var server = tcp.createServer(function (socket) {
3 socket.setEncoding("utf8");
4 socket.addListener("connect", function () {
5 socket.write("hello\r\n");
6 });
7 socket.addListener("data", function (data) {
8 socket.write(data);
9 });
10 socket.addListener("end", function () {
11 socket.write("goodbye\r\n");
12 socket.end();
13 });
14 });
15 server.listen(7000, "localhost");