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

<b>        case &quot;data&quot;: data += value + &quot;\n&quot;; break;</b>

<b>        case &quot;id&quot;: lastEventld = value; break;</b>

<b>        case &quot;retry&quot;: retrydelay = parselnt(value) || 1000; break;</b>

<b>        default: break; // Игнорировать любые другие строки </b>

<b>        } </b>

<b>        if (line === &quot;&quot;) { // Пустая строка означает отправку события</b>

<b>          if (evtsrc.onmessage &amp;&amp; data !== &quot;&quot;) { </b>

<b>            // Отсечь завершающий символ перевода строки</b>

<b>            if (data.charAt(data.length-1) == &quot;\n&quot;)</b>

<b>            data = data.substrings, data.length-1);</b>

<b>            evtsrc.onmessage({ // Имитация объекта Event </b>

<b>                   type: eventName, // тип события </b>

<b>                   data: data, // данные </b>

<b>                   origin: url // происхождение данных </b>

<b>            });</b>

<b>          }</b>

<b>          data = &quot;&quot;;</b>

<b>          continue;</b>

<b>        }</b>

<b>      }</b>

<b>    }</b>

<b>  };</b>

<b>}</b>

Завершим описание архитектуры Comet примером серверного сценария. В примере 18.17 приводится реализация HTTP-сервера на серверном JavaScript, который выполняется под управлением интерпретатора Node (раздел 12.2). Когда клиент обращается к корневому URL «/», сервер отправляет ему реализацию клиента чата, представленную в примере 18.15, и реализацию имитации, представленную в примере 18.16. Когда клиент выполняет GET-запрос по URL-адресу «/chat», сервер сохраняет поток ответа в массиве и поддерживает соединение открытым. А когда клиент выполняет POST-запрос к адресу «/chat», сервер интерпретирует тело запроса как текст сообщения и добавляет префикс «data:», как того требует протокол Server-Sent Events, во все открытые потоки сообщений. Если вы установите интерпретатор Node, вы сможете запустить этот пример сервера локально. Он прослушивает порт 8000, поэтому после запуска сервера в броузере необходимо будет указать адрес http://localhost:8000, чтобы соединиться с сервером и начать общение с самим собой.

Пример 18.17. Сервер чата, поддерживающий протокол Server-Sent Events

<b>// Этот программный код на серверном JavaScript предназначен для выполнения</b>

<b>// под управлением NodeJS. Он реализует очень простую, полностью анонимную комнату чата.</b>

<b>// Для отправки новых сообщений в чат следует использовать POST-запросы к URL /chat,</b>

<b>// а для получения текста/потока-событий сообщений следует использовать GET-запросы</b>

<b>// к тому же URL. При выполнении GET-запроса к / возвращается простой HTML-файл,</b>

<b>// содержащий пользовательский интерфейс чата для клиента.</b>

<b>var http = require('http'); // Реализация API HTTP-сервера в NodeJS</b>

<b>// HTML-файл для клиента чата. Используется ниже.</b>

<b>var clientui = require('fs').readFileSync( &quot;chatclient.html&quot;);</b>

<b>var emulation = require( fs').readFileSync(&quot;EventSourceEmulation.js&quot;);</b>

<b>// Массив объектов ServerResponse, который будет использоваться для отправки событий </b>

<b>var clients = [];</b>

<b>// Отправлять комментарий клиентам каждые 20 секунд, чтобы предотвратить</b>

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

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

<b>  clients.forEach(function(client) {</b>

<b>    client. write('': ping\n&quot;);</b>

<b>  });</b>

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

<b>// Создать новый сервер</b>

<b>var server = new http.Server();</b>

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

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

<b>  // Проанализировать запрошенный URL</b>

<b>  var url = require(’url').parse(request.url);</b>

<b>  // Если запрошен URL &quot;/&quot;, отправить пользовательский интерфейс чата,</b>

<b>  if (url.pathname === &quot;/&quot;) { // Запрошен пользовательский интерфейс чата</b>

<b>    response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});</b>

<b>    response.write(&quot;&lt;script&gt;&quot; + emulation + &quot;&lt;/script&gt;&quot;);</b>

<b>    response.write(clientui);</b>

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

<b>    return;</b>

<b>  }</b>

<b>  // Если запрошен любой другой URL, кроме &quot;/chat&quot;, отправить код 404</b>