Одна из самых крутых новых возможностей HTML5 — это WebSockets, которые позволяют нам общаться с сервером без использования запросов AJAX. В этом руководстве мы рассмотрим процесс запуска сервера WebSocket на PHP, а затем создадим клиент для отправки и получения на него сообщений по протоколу WebSocket.
Что такое WebSockets?
WebSockets — это метод двусторонней связи через один (TCP) сокет, тип технологии PUSH. На данный момент он все еще стандартизирован W3C; Тем не менее, последние версии Chrome и Safari поддерживают WebSockets.
Что заменяют WebSockets?
Веб-розетки могут заменить длинные опросы. Это интересная концепция; клиент отправляет запрос на сервер — теперь, вместо того, чтобы сервер, отвечающий данными, которых он может не иметь, он по существу сохраняет соединение открытым до тех пор, пока свежие, актуальные данные не будут готовы к отправке — клиент затем получит это и отправляет еще один запрос. Это имеет свои преимущества: одним из них является уменьшенная задержка, поскольку уже открытое соединение не требует установления нового соединения. Однако длительный опрос на самом деле не является частью причудливой технологии: для запроса также возможен тайм-аут, и, таким образом, в любом случае потребуется новое соединение.
Многие Ajax-приложения используют вышеперечисленное — это часто можно объяснить плохим использованием ресурсов.
Не было бы замечательно, если бы сервер мог проснуться однажды утром и отправить свои данные клиентам, которые готовы слушать без какого-либо заранее установленного соединения? Добро пожаловать в мир технологии PUSH!
Шаг 1: Получить сервер WebSocket
В этом руководстве основное внимание будет уделено построению клиента, а не реализации сервера.
Я использую XAMPP в Windows 7 для локального запуска PHP-сервера. Возьмите копию phpwebsockets, которая является сервером WebSocket на PHP. (Примечание: у меня возникли некоторые проблемы с этой версией, я внес в нее некоторые изменения и включу ее в исходные файлы). Существуют различные реализации WebSocket; если один из них не работает, вы можете попробовать другой или просто продолжить учебник.
- jWebSocket (Java)
- web-socket-ruby (рубин)
- Сокетный IO-узел (node.js)
Запустите сервер Apache
Шаг 2: Изменить URL и порты
Измените сервер в соответствии с вашими настройками, например, в setup.class.php:
1
2
3
4
|
public function __construct($host=’localhost’,$port=8000,$max=100)
{
$this->createSocket($host,$port);
}
|
Просмотрите файлы и внесите необходимые изменения.
Шаг 3: Начните сборку клиента
Позволяет получить основной шаблон; это мой файл client.php:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<!DOCTYPE html>
<html>
<head>
<script src=»http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js»></script>
<title>WebSockets Client</title>
</head>
<body>
<div id=»wrapper»>
<div id=»container»>
<h1>WebSockets Client</h1>
<div id=»chatLog»>
</div><!— #chatLog —>
<p id=»examples»>eg try ‘hi’, ‘name’, ‘age’, ‘today'</p>
<input id=»text» type=»text» />
<button id=»disconnect»>Disconnect</button>
</div><!— #container —>
</div>
</body>
</html>
|
Итак, в этом коде мы создаем простой шаблон: у нас есть поле для журнала чата, поле ввода и одна кнопка отключения.
Шаг 4: Добавьте немного CSS
Ничего особенного, просто разметьте некоторые элементы.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
body {
font-family:Arial, Helvetica, sans-serif;
}
#container{
border:5px solid grey;
width:800px;
margin:0 auto;
padding:10px;
}
#chatLog{
padding:5px;
border:1px solid black;
}
#chatLog p {
margin:0;
}
.event {
color:#999;
}
.warning{
font-weight:bold;
color:#CCC;
}
|
Шаг 5: События WebSocket
Во-первых, давайте попробуем понять идею событий WebSocket.
События
Мы будем использовать три события:
- onopen: когда сокет открылся
- onmessage: когда сообщение получено
- onclose: когда розетка закрыта
Но как мы можем это реализовать?
Сначала создайте объект WebSocket
var socket = new WebSocket ("ws: // localhost: 8000 / socket / server / startDaemon.php");
И проверка на события так же просто, как:
socket.onopen = function () { alert («Розетка открыта!»); }
Но как насчет того, когда мы получим сообщение?
socket.onmessage = function (msg) { оповещения (MSG); //Потрясающие! }
Тем не менее, давайте избегать использования блоков предупреждений и фактически интегрировать то, что мы узнали, в страницу клиента.
Шаг 6: JavaScript
Итак, начнем. Сначала мы помещаем наш код в функцию готовности документа jQuery, затем проверяем, есть ли у пользователя браузер с поддержкой WebSockets. Если они этого не делают, мы добавляем ссылку на Chrome в HTML.
$ (документ) .ready (function () { if (! ("WebSocket" в окне)) { $ ('# chatLog, input, button, #examples'). fadeOut ("fast"); $ ('<p> О нет, вам нужен браузер, который поддерживает WebSockets. Как насчет <a href="http://www.google.com/chrome"> Google Chrome </a>? </ p>') .appendTo ( '# контейнер'); } Еще { // У пользователя есть WebSockets подключения (); function connect () { // код функции подключения ниже } });
Как видите, если у пользователя есть WebSockets, тогда мы вызываем функцию connect (). Это ядро функциональности: мы начнем с событий открытия, закрытия и получения.
Мы определим URL нашего сервера
гнездо var; var host = "ws: // localhost: 8000 / socket / server / startDaemon.php";
Подождите, где http
в этом URL? Ах да, это URL-адрес WebSocket, поэтому он использует другой протокол. Вот разбивка частей нашего URL:
Давайте продолжим с нашей функцией connect (). Мы поместим наш код в блок try / catch; поэтому, если что-то пойдет не так, мы можем сообщить об этом пользователю. Мы создаем новый WebSocket и передаем сообщение в функцию сообщения, которую я объясню позже. Мы создаем наши функции onopen, onmessage и onclose. Обратите внимание, что мы также показываем пользователю статус сокета; в этом нет необходимости, но я включил его сюда, поскольку это может быть полезно для отладки.
- СОЕДИНЕНИЕ = 0
- OPEN = 1
- ЗАКРЫТО = 2
function connect () { пытаться{ гнездо var; var host = "ws: // localhost: 8000 / socket / server / startDaemon.php"; var socket = новый WebSocket (хост); message ('<p class = "event"> Статус сокета:' + socket.readyState); socket.onopen = function () { message ('<p class = "event"> Статус сокета:' + socket.readyState + '(open)'); } socket.onmessage = function (msg) { message ('<p class = "message"> Получено:' + msg.data); } socket.onclose = function () { message ('<p class = "event"> Статус сокета:' + socket.readyState + '(Closed)'); } } catch (исключение) { сообщение ( '<р> Ошибка' + исключение); } }
Функция message () довольно проста, она берет некоторый текст, который мы хотим показать пользователю, и добавляет его в chatLog. Мы создаем соответствующий класс для тегов абзаца в функциях событий сокета, поэтому в функции сообщения есть только один закрывающий тег абзаца.
функциональное сообщение (msg) { . $ ( '# ChatLog') Append (сообщ + '</ p>'); }
Слишком далеко…
Если вы следили за этим, молодец! Нам удалось создать базовый шаблон HTML / CSS, создать и установить соединение WebSocket и держать пользователя в курсе, как был достигнут прогресс с соединением.
Шаг 7: Отправка данных
Теперь вместо кнопки отправки мы можем определить, когда пользователь нажимает кнопку возврата на клавиатуре, и запустить функцию отправки. «13», которое вы видите ниже, является клавишей ASCII для кнопки ввода.
$ ('# text'). нажатие клавиши (функция (событие) { if (event.keyCode == '13') { Отправить(); } });
А вот и функция send ():
function send () { var text = $ ('# text'). val (); если (текст == "") { сообщение ('<p class = "warning"> Пожалуйста, введите сообщение'); возвращение ; } пытаться{ socket.send (текст); сообщение ('<p class = "событие"> отправлено:' + текст) } catch (исключение) { сообщение ('<p class = "warning"> Ошибка:' + исключение); } $ ( '# Текст') Вал ( ""); }
Помните, что то, что вы видите выше, может быть небольшим фрагментом кода, но в действительности код, который нам действительно нужен:
socket.send (); // Спасибо JavaScript
Дополнительный код выполняет ряд действий: обнаружение того, что пользователь ничего не вводил, но все же нажимает клавишу возврата, очистка поля ввода и вызов функций сообщения.
Шаг 8: Закрытие сокета
Закрытие сокета довольно просто: прикрепите обработчик щелчков к нашей кнопке отключения, и все готово!
$ ( '# Разъединение'). Нажмите (функция () { socket.close (); });
Завершенный JavaScript
$ (документ) .ready (function () { if (! ("WebSocket" в окне)) { $ ('# chatLog, input, button, #examples'). fadeOut ("fast"); $ ('<p> О нет, вам нужен браузер, который поддерживает WebSockets. Как насчет <a href="http://www.google.com/chrome"> Google Chrome </a>? </ p>') .appendTo ( '# контейнер'); } Еще { // У пользователя есть WebSockets подключения (); function connect () { гнездо var; var host = "ws: // localhost: 8000 / socket / server / startDaemon.php"; пытаться{ var socket = новый WebSocket (хост); message ('<p class = "event"> Статус сокета:' + socket.readyState); socket.onopen = function () { message ('<p class = "event"> Статус сокета:' + socket.readyState + '(open)'); } socket.onmessage = function (msg) { message ('<p class = "message"> Получено:' + msg.data); } socket.onclose = function () { message ('<p class = "event"> Статус сокета:' + socket.readyState + '(Closed)'); } } catch (исключение) { сообщение ( '<р> Ошибка' + исключение); } function send () { var text = $ ('# text'). val (); если (текст == "") { сообщение ('<p class = "warning"> Пожалуйста, введите сообщение'); возвращение ; } пытаться{ socket.send (текст); сообщение ('<p class = "событие"> отправлено:' + текст) } catch (исключение) { сообщение ('<p class = "warning">'); } $ ( '# Текст') Вал ( ""); } функциональное сообщение (msg) { . $ ( '# ChatLog') Append (сообщ + '</ p>'); } $ ('# text'). нажатие клавиши (функция (событие) { if (event.keyCode == '13') { Отправить(); } }); $ ( '# Разъединение'). Нажмите (функция () { socket.close (); }); } // Завершить соединение } // Конец еще });
Шаг 9: Запустите сервер WebSocket
Нам понадобится доступ к командной строке. К счастью, у XAMPP есть удобная опция оболочки. Нажмите «Оболочка» на панели управления XAMPP и введите:
php -q path \ to \ server.php
Вы запустили сервер WebSocket!
Законченный
Когда страница загружается, попытка установить соединение через WebSocket (попробуйте отредактировать код, чтобы у пользователя была возможность подключения / отключения). Затем пользователь может вводить сообщения и получать сообщения с сервера.
Это оно!
Спасибо за прочтение; Я надеюсь, вам понравился этот урок! Помните, какими бы захватывающими ни были WebSockets, все может измениться Вы можете обратиться сюда, чтобы быть в курсе API W3C WebSocket .
Если вы хотите больше работать с HMTL5, взгляните на широкий выбор элементов кода HTML5 на Envato Market. Есть аудиоплееры , отзывчивые видео галереи , интерактивные карты и многое другое.