JavaScript. Подробное руководство, 6-е издание, стр. 166
<b> console.log("Принято соединение от", stream.remoteAddress);</b><b> stream.on("data", function(data) { stream.write(data); });</b><b> stream.on("end", function(data) { console.log("Соединение закрыто"); });</b><b>});</b>В дополнение к базовому модулю «net» в интерпретаторе Node имеется встроенная поддержка протокола HTTP в виде модуля «http». Особенности его использования демонстрируют примеры, следующие ниже.
12.2.1. Пример использования Node: HTTP-сервер
В примере 12.2 приводится реализация простого HTTP-сервера, основанная на особенностях интерпретатора Node. Она обслуживает файлы в текущем каталоге и дополнительно реализует два адреса URL специального назначения, которые обслуживаются особым образом. В этой реализации используется модуль «http», входящий в состав интерпретатора Node, и применяются API доступа к файлам и потокам ввода/вывода, демонстрировавшиеся выше. В примере 18.17, в главе 18, демонстрируется аналогичный специализированный НТТР-сервер.
Пример 12.2. HTTP-сервер, основанный на особенностях Node
<b>// Простой NodeJS HTTP-сервер, обслуживающий файлы в текущем каталоге </b><b>// и реализующий два специальных адреса URL для нужд тестирования.</b><b>// Подключение к серверу выполняется по адресу </b><a href="http://localhost;8000/"><b>http://localhost;8000</b></a><b>// или </b><a href="http://127.0-0.1:8000/"><b>http://127.0-0.1:8000</b></a><b>// Сначала необходимо загрузить используемые модули </b><b>var http = require( http'); // API НТТР-сервера</b><b>var fs = require('fs'); // Для работы с локальными файлами</b><b>var server = new http.Server(); // Создать новый HTTP-сервер </b><b>server.listen(8000); // Прослушивать порт 8000.</b><b>// Для регистрации обработчиков событий в Node используется метод "оп()".</b><b>// Когда сервер получает новый запрос, для его обработки вызывается функция, </b><b>server.on("request", function (request, response) {</b><b> // Выполнить разбор адреса URL</b><b> var url = require("url").parse(request.url);</b><b> // Специальный адрес URL, который вынуждает сервер выполнить задержку перед ответом. </b><b> // Это может быть полезно для имитации работы с медленным сетевым подключением, </b><b> if (url.pathname === "/test/delay") {</b><b> // Величина задержки определяется из строки запроса </b><b> // или устанавливается равной 2000 миллисекунд </b><b> var delay = parseInt(url.query) || 2000;</b><b> // Установить код состояния и заголовки ответа</b><b> response.writeHead(200, {"Content-Type": "text/plain; charset=UTF-8 "});</b><b> // Начать отправку ответа немедленно</b><b> response.write("Задержка на " + delay + " миллисекунд...”);</b><b> // А затем завершить другой функцией, которая будет вызвана позже. </b><b> setTimeout(function() { </b><b> response.write("roTOBO."); </b><b> response.end();</b><b> }, delay);</b><b> }</b><b> // Если запрошен адрес "/test/mirror", отправить запрос обратно целиком.</b><b> // Удобно, когда необходимо увидеть тело и заголовки запроса, </b><b> else if (url.pathname === "/test/mirror") {</b><b> // Код состояния и заголовки ответа</b><b> response.writeHead(200,{"Content-Type": "text/plain; charset=UTF-8"});</b><b> // Вставить в ответ тело запроса</b><b> response.write(request.method + " " + request.url +</b><b> " HTTP/" + request.httpVersion + "\r\n");</b><b> // И заголовки запроса </b><b> for(var h in request.headers) {</b><b> response.write(h + ": + request.headers[h] + "\r\n");</b><b> }</b><b> response.write("\r\n"); </b><b> // За заголовками следует дополнительная пустая строка </b><b> // Завершение отправки ответа выполняется следующими функциями-обработчиками:</b><b> // Если в chunk передается тело запроса, вставить его в ответ, </b><b> request.on("data", function(chunk) { </b><b> response.write(chunk); });</b><b> // Когда достигнут конец запроса, ответ также завершается, </b><b> request.on("end", function(chunk) { response.end(); });</b>