JavaScript. Подробное руководство, 6-е издание, стр. 166

<b>  console.log(&quot;Принято соединение от&quot;, stream.remoteAddress);</b>

<b>  stream.on(&quot;data&quot;, function(data) { stream.write(data); });</b>

<b>  stream.on(&quot;end&quot;, function(data) { console.log(&quot;Соединение закрыто&quot;); });</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 используется метод &quot;оп()&quot;.</b>

<b>// Когда сервер получает новый запрос, для его обработки вызывается функция, </b>

<b>server.on(&quot;request&quot;, function (request, response) {</b>

<b>  // Выполнить разбор адреса URL</b>

<b>  var url = require(&quot;url&quot;).parse(request.url);</b>

<b>  // Специальный адрес URL, который вынуждает сервер выполнить задержку перед ответом. </b>

<b>  // Это может быть полезно для имитации работы с медленным сетевым подключением, </b>

<b>  if (url.pathname === &quot;/test/delay&quot;) {</b>

<b>    // Величина задержки определяется из строки запроса </b>

<b>    // или устанавливается равной 2000 миллисекунд </b>

<b>    var delay = parseInt(url.query) || 2000;</b>

<b>    // Установить код состояния и заголовки ответа</b>

<b>    response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/plain; charset=UTF-8 &quot;});</b>

<b>    // Начать отправку ответа немедленно</b>

<b>    response.write(&quot;Задержка на &quot; + delay + &quot; миллисекунд...”);</b>

<b>    // А затем завершить другой функцией, которая будет вызвана позже. </b>

<b>    setTimeout(function() { </b>

<b>        response.write(&quot;roTOBO.&quot;); </b>

<b>        response.end();</b>

<b>    }, delay);</b>

<b>  }</b>

<b>  // Если запрошен адрес &quot;/test/mirror&quot;, отправить запрос обратно целиком.</b>

<b>  // Удобно, когда необходимо увидеть тело и заголовки запроса, </b>

<b>  else if (url.pathname === &quot;/test/mirror&quot;) {</b>

<b>    // Код состояния и заголовки ответа</b>

<b>    response.writeHead(200,{&quot;Content-Type&quot;: &quot;text/plain; charset=UTF-8&quot;});</b>

<b>    // Вставить в ответ тело запроса</b>

<b>    response.write(request.method + &quot; &quot; + request.url +</b>

<b>      &quot; HTTP/&quot; + request.httpVersion + &quot;\r\n&quot;);</b>

<b>    // И заголовки запроса </b>

<b>    for(var h in request.headers) {</b>

<b>      response.write(h + &quot;: + request.headers[h] + &quot;\r\n&quot;);</b>

<b>    }</b>

<b>    response.write(&quot;\r\n&quot;); </b>

<b>    // За заголовками следует дополнительная пустая строка </b>

<b>    // Завершение отправки ответа выполняется следующими функциями-обработчиками:</b>

<b>    // Если в chunk передается тело запроса, вставить его в ответ, </b>

<b>    request.on(&quot;data&quot;, function(chunk) { </b>

<b>      response.write(chunk); });</b>

<b>    // Когда достигнут конец запроса, ответ также завершается, </b>

<b>    request.on(&quot;end&quot;, function(chunk) { response.end(); });</b>