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

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

Жанры

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

// принудительного прерывания

if (xhr.status >= 300) return;

// He восстанавливать после ошибки

setTimeout(connect, retrydelay); // Ждать и повторить попытку

};

// Устанавливает соединение

function connect {

charsReceived = 0; type = null; xhr.open("GET", url);

xhr.setRequestHeader(“Cache-Control", "no-cache");

if (lastEventld)

xhr.setRequestHeader("Last-Event-ID", lastEventld);

xhr.send;

}

// При получении данных обрабатывает их и вызывает обработчик onmessage.

// Эта функция реализует работу с протоколом Server-Sent Events

function processData {

if (!type) { // Проверить тип ответа, если это еще не сделано

type = xhr.getResponseHeader(’Content-Type’);

if (type !== "text/event-stream") {

aborted = true;

xhr.abort;

return;

}

}

// Запомнить полученный объем данных и извлечь только ту часть ответа,

// которая еще не была обработана,

var chunk = xhr.responseText.substring(charsReceived);

charsReceived = xhr.responseText.length;

// Разбить текст на строки и обойти их в цикле.

var lines = chunk.replace(/(\r\n|\r|\n)$/,"").split(/\r\n|\r|\n/);

for(var і = 0; і < lines.length; i++) {

var line = lines[i], pos = line.indexOf(":"), name.value="";

if (pos == 0) continue; // Игнорировать комментарии

if (pos > 0) { // поле name:value

name = line.substring(0,pos);

value = line.substring(pos+1);

if (value.charAt(O) == " ") value = value.substrings);

}

else name = line; // только поле name

switch(name) {

case "event": eventName = value; break;

case "data": data += value + "\n"; break;

case "id": lastEventld = value; break;

case "retry": retrydelay = parselnt(value) || 1000; break;

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

}

if (line === "") { // Пустая строка означает отправку события

if (evtsrc.onmessage && data !== "") {

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

if (data.charAt(data.length-1) == "\n")

data = data.substrings, data.length-1);

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

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

data: data, // данные

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

});

}

data = "";

continue;

}

}

}

};

}

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

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

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Ученик. Книга вторая

Первухин Андрей Евгеньевич
2. Ученик
Фантастика:
фэнтези
5.40
рейтинг книги
Ученик. Книга вторая

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Избрание сочинения в трех томах. Том второй

Кочетов Всеволод Анисимович
Проза:
советская классическая проза
5.00
рейтинг книги
Избрание сочинения в трех томах. Том второй

Древесный маг Орловского княжества 13

Павлов Игорь Васильевич
13. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 13

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

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

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая