JavaScript. Подробное руководство, 6-е издание, стр. 292
<b> case "data": data += value + "\n"; break;</b><b> case "id": lastEventld = value; break;</b><b> case "retry": retrydelay = parselnt(value) || 1000; break;</b><b> default: break; // Игнорировать любые другие строки </b><b> } </b><b> if (line === "") { // Пустая строка означает отправку события</b><b> if (evtsrc.onmessage && data !== "") { </b><b> // Отсечь завершающий символ перевода строки</b><b> if (data.charAt(data.length-1) == "\n")</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 = "";</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( "chatclient.html");</b><b>var emulation = require( fs').readFileSync("EventSourceEmulation.js");</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");</b><b> });</b><b>}, 20000);</b><b>// Создать новый сервер</b><b>var server = new http.Server();</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> if (url.pathname === "/") { // Запрошен пользовательский интерфейс чата</b><b> response.writeHead(200, {"Content-Type": "text/html"});</b><b> response.write("<script>" + emulation + "</script>");</b><b> response.write(clientui);</b><b> response.end();</b><b> return;</b><b> }</b><b> // Если запрошен любой другой URL, кроме "/chat", отправить код 404</b>