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

ЖАНРЫ

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

Чтобы отправить данные серверу через сокет, следует вызвать метод

send
сокета:

socket.send("Привет, сервер!");

Текущая версия прикладного интерфейса веб-сокетов поддерживает только текстовые сообщения и отправляет их в виде строк в кодировке UTF-8. Однако текущая версия спецификации протокола веб-сокетов включает поддержку двоичных сообщений, и будущие версии прикладного интерфейса, возможно, будут обеспечивать обмен двоичными данными с сервером.

По окончании взаимодействия

с сервером сценарий может закрыть веб-сокет вызовом его метода
close
.

Веб-сокеты являются двунаправленными, и единственное соединение, установленное через веб-сокет, может использоваться клиентом и сервером для передачи сообщений друг другу в любой момент времени. Это взаимодействие не обязательно должно иметь форму запросов и ответов. Каждая служба, основанная на веб-сокетах, будет определять собственный «подпротокол» передачи данных между клиентом и сервером. С течением времени эти «подпротоколы» могут развиться, и вам может потребоваться реализовать клиенты и серверы, поддерживающие несколько версий подпротокола. К счастью, протокол веб-сокетов включает механизм, дающий возможность договориться о выборе подпротокола, который поддерживается и клиентом, и сервером. Конструктору

WebSocket
можно передать массив строк. Сервер получит его в виде списка подпротоколов, поддерживаемых клиентом. Сервер выберет подпротокол, поддерживаемый им, и отправит его обратно клиенту. После установления соединения клиент сможет определить, какой подпротокол можно использовать, проверив свойство
protocol
объекта
WebSocket
.

В разделе 18.3 описывается прикладной интерфейс объекта

EventSource
и демонстрируется его применение на примере реализации клиента и сервера чата. Вебсокеты еще больше упрощают реализацию подобных приложений. В примере 22.16 демонстрируется очень простой клиент чата: он напоминает пример 18.15, но использует веб-сокеты для двунаправленного обмена сообщениями вместо объекта EventSource для приема сообщений и XMLHttpRequest - для отправки.

Пример 22.16. Клиент чата на основе веб-сокетов

<script>

window.onload = function {

// Позаботиться о некоторых деталях пользовательского интерфейса

var nick = prompt("Введите свой псевдоним"); // Получить псевдоним

var input = document.getElementById("input"); // Отыскать поле ввода

input.focus; // Установить фокус ввода

// Открыть веб-сокет для отправки и приема сообщений в чате.

// Предполагается, что HTTP-сервер, откуда загружается сценарий, также

// поддерживает веб-сокеты, и для связи с ним используется то же имя хоста

// и номер порта, но вместо протокола http:// используется протокол ws://

var socket = new WebSocket("ws://" + location.host + "/");

// Так через веб-сокет принимаются сообщения
с сервера

socket.onmessage = function(event) { // Вызывается при получении сообщения

var msg = event.data; // Получить текст из объекта события

var node = document.createTextNode(msg); // Создать текстовый узел

var div = document.createElement("div"); // Создать элемент <div>

div.appendChild(node); // Добавить текстовый узел

document.body.insertBefore(div, input); // и вставить div перед полем ввода

input.scrollIntoView; // Гарантировать видимость элемента input

}

// Так через веб-сокет отправляются сообщения на сервер

input.onchange = function { // Когда пользователь нажмет клавишу Enter

var msg = nick + ": " + input.value; // Имя пользователя и текст

socket.send(msg); // Отправить через сокет

input.value = ""; // Подготовиться к вводу следующего сообщения

}

};

</script>

<!-- Пользовательский интерфейс - это единственное поле ввода -->

<!-- Новые сообщения в чате будут появляться перед этим элементом -->

<input id="input” style="width:100%"/>

В примере 22.17 демонстрируется реализация сервера чата, основанного на веб-сокетах, которая предназначена для работы под управлением интерпретатора Node (раздел 12.2). Сравните этот пример с примером 18.17, чтобы увидеть, что веб-сокеты упрощают не только клиентскую часть реализации чата, но и серверную.

Пример 22.17 Сервер чата на основе веб-сокетов, выполняющийся под управлением Node

/*

* Этот серверный сценарий на языке JavaScript предназначен для выполнения

* под управлением NodeJS. Он играет роль сервера веб-сокетов, реализованного поверх

* HTTP-сервера с использованием внешней библиотеки websocket, которую можно найти

* по адресу: https://github.com/miksago/node-websocket-server/ . При обращении

* к ресурсу "/" он возвращает HTML-файл клиента чата. В ответ на обращение к любому

* другому ресурсу возвращается код 404. Сообщения принимаются посредством протокола

* веб-сокетов и просто рассылаются по всем активным соединениям.

Поделиться с друзьями: