Чтение онлайн

на главную - закладки

Жанры

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

Поделиться:
Популярные книги

Гнев Пламенных

Дмитриева Ольга Олеговна
5. Пламенная
Фантастика:
фэнтези
4.80
рейтинг книги
Гнев Пламенных

Главбухша

Романов Владислав Иванович
Любовные романы:
остросюжетные любовные романы
5.00
рейтинг книги
Главбухша

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Гамбургский счет: Статьи – воспоминания – эссе (1914–1933)

Шкловский Виктор Борисович
Научно-образовательная:
история
5.00
рейтинг книги
Гамбургский счет: Статьи – воспоминания – эссе (1914–1933)

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 28

Источники силы

Amazerak
4. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Источники силы

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Кодекс Императора IV

Сапфир Олег
4. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора IV

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Запечатанный во тьме. Том 2

NikL
2. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 2

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9