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

<b>var socket = new WebSocket(&quot;ws://ws.example.com:1234/resource&quot;);</b>

Протокол веб-сокетов

Чтобы использовать веб-сокеты в сценариях на языке JavaScript, достаточно будет освоить клиентский прикладной интерфейс веб-сокетов, описываемый здесь. Не существует эквивалентного серверного прикладного интерфейса для создания серверов с поддержкой веб-сокетов; в этом разделе будет представлен простой пример сервера, основанного на использовании интерпретатора Node (раздел 12.2) и сторонней серверной библиотеки поддержки веб-сокетов. Клиент и сервер взаимодействуют через долгоживущие TCP-сокеты, следуя правилам, определяемым протоколом веб-соке-тов. Мы не будем рассматривать здесь особенности протокола, но следует отметить, что протокол веб-сокетов спроектирован очень аккуратно, благодаря чему веб-серверы могут легко обрабатывать HTTP-соединения и соединения на основе веб-сокетов через один и тот же порт.

Веб-сокеты получили широкую поддержку среди производителей броузеров. В ранней, предварительной версии протокола веб-сокетов была обнаружена серьезная брешь в системе безопасности, поэтому на момент написания этих строк в некоторых броузерах поддержка веб-сокетов была отключена, - до стандартизации безопасной версии протокола. В Firefox 4, например, может потребоваться явно включить поддержку веб-сокетов, открыв страницу about:config и установив переменную «network.websocket. override-security-block» в значение true.

*********************************************

Аргументом конструктора

<b>WebSocket()</b>
является URL-адрес, в котором используется протокол ws:// (или wss:// - в случае с безопасными соединениями, по аналогии с https://). URL-адрес определяет имя хоста, к которому выполняется подключение, и может также определять порт (по умолчанию веб-сокеты используют тот же порт, что и протоколы HTTP и HTTPS) и путь или ресурс.

После создания сокета в нем обычно регистрируются обработчики событий:

<b>socket.onopen = function(e) { /* Соединение установлено. */ };</b>

<b>socket.onclose = function(e) { /* Соединение закрыто. */ };</b>

<b>socket.onerror = function(e) { /* Что-то пошло не так! */ };</b>

<b>socket.onmessage = function(e) {</b>

<b>  var message = e.data; /* Сервер послал сообщение. */</b>

<b>};</b>

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

<b>send()</b>
сокета:

<b>socket.send(&quot;Привет, сервер!&quot;);</b>

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

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

<b>close()</b>
.

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

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

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

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

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

<b>&lt;script&gt;</b>

<b>window.onload = function() {</b>

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

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

<b>  var input = document.getElementById(&quot;input&quot;); // Отыскать поле ввода</b>

<b>  input.focus(); // Установить фокус ввода</b>

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

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

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

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

<b>  var socket = new WebSocket(&quot;ws://&quot; + location.host + &quot;/&quot;);</b>

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

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

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

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

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

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