JavaScript. Подробное руководство, 6-е издание
Шрифт:
Пример 18.17. Сервер чата, поддерживающий протокол Server-Sent Events
// Этот программный код на серверном JavaScript предназначен для выполнения
// под управлением NodeJS. Он реализует очень простую, полностью анонимную комнату чата.
// Для отправки новых сообщений в чат следует использовать POST-запросы к URL /chat,
// а для
получения текста/потока-событий сообщений следует использовать GET-запросы
// к тому же URL. При выполнении GET-запроса к / возвращается простой HTML-файл,
// содержащий пользовательский интерфейс чата для клиента.
var http = require('http'); // Реализация API HTTP-сервера в NodeJS
// HTML-файл для клиента чата. Используется ниже.
var clientui = require('fs').readFileSync( "chatclient.html");
var emulation = require( fs').readFileSync("EventSourceEmulation.js");
// Массив объектов ServerResponse, который будет использоваться для отправки событий
var clients = [];
// Отправлять комментарий клиентам каждые 20 секунд, чтобы предотвратить
// закрытие соединения с последующими попытками восстановить его
setInterval(function {
clients.forEach(function(client) {
client. write('': ping\n");
});
}, 20000);
// Создать новый сервер
var server = new http.Server;
// Когда сервер получит новый запрос, он вызовет эту функцию
server.on( "request", function (request, response) {
// Проанализировать запрошенный URL
var url = require(’url').parse(request.url);
// Если запрошен URL "/", отправить пользовательский интерфейс чата,
if (url.pathname === "/") { // Запрошен пользовательский интерфейс чата
response.writeHead(200, {"Content-Type": "text/html"});
response.write("<script>" + emulation + "</script>");
response.write(clientui);
response.end;
return;
}
//
Если запрошен любой другой URL, кроме "/chat", отправить код 404
else
if (url.pathname !== "/chat") {
response.writeHead(404);
response.end;
return;
}
// Если был выполнен POST-запрос - клиент отправил новое сообщение
if (request.method === "POST") {
request.setEncoding("utf8");
var body = "";
// При получении фрагмента данных добавить его в переменную body
request.on("data", function(chunk) {
body += chunk; });
// По завершении запроса отправить пустой ответ
// и широковещательное сообщение всем клиентам,
request.on("end", function {
response.writeHead(200); // Ответ на запрос
response.end;
// Преобразовать сообщение в формат текст/поток-событий.
// Убедиться, что все строки начинаются с префикса "data:"
// и само сообщение завершается двумя символами перевода строки,
message = 'data: ' + body, replace('\n’, '\ndata: ') + "\r\n\r\n";
// Отправить сообщение всем клиентам
clients.forEach(function(client) { client.write(message); });
});
}
// Если иначе, клиент запросил поток сообщений
else {
// Установить тип содержимого и отправить начальное событие message
Поделиться:
Популярные книги
Кодекс Охотника. Книга XXXIV
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Иной. Том 1. Школа на краю пустыни
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Афганский рубеж 3
3. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Вампилов
1546. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Демон-хранитель
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
На цепи
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Мы друг друга не выбирали
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Ботаник 2
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Искатель 2
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Тихие ночи
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Я все еще барон
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 9
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Здравствуй, 1985-й
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Три `Д` для миллиардера. Свадебный салон
Любовные романы:
современные любовные романы
короткие любовные романы
7.14