Html5, веб-сокети
Серверні події, розглянуті раніше, є ідеальним інструментом, коли потрібно отримати послідовність повідомлень з веб-сервера. Але при цьому зв'язок виходить повністю односторонньою. Браузер не може відповідати на повідомлення або вступати в більш складний діалог з сервером.
Якщо ви створюєте веб-додаток, в якому потрібне серйозне двостороння взаємодія браузера з веб-сервером, найкращим підходом до його реалізації (не вдаючись до допомоги Flash) буде, можливо, використання об'єкта XMLHttpRequest. Залежно від типу створюваного додатка цей підхід може працювати так, як потрібно. Але тут існує і достатня кількість можливих проблем.
Перш за все, об'єкт XMLHttpRequest не дуже добре підходить для швидкого обміну множинними повідомленнями (наприклад, в чаті). Потім, в ньому немає можливості зв'язати один виклик з іншим, тому при кожному новому запиті від веб-сторінки сервер повинен обчислювати з самого початку, кому ця сторінка належить. Тому рівень складності коду для обробки ряду пов'язаних запитів від веб-сторінки може дуже швидко вирости до практично нездійсненною.
Для всіх цих проблем є рішення, хоча воно ще не цілком готове. Цим рішенням є технологія веб-сокетів (web sockets). яка дозволяє браузеру утримувати відкрите підключення до сервера і обмінюватися повідомленнями протягом будь-якого необхідного часу.
Технологія веб-сокетів викликала велике збудження в середовищі веб-розробників, але вона ще перебуває в процесі розвитку, хоча вже має непогану браузерную сумісність:
Підтримка браузерами веб-сокетів
На даний момент найкраще тестувати сторінки, що використовують веб-сокети, в браузері Chrome, який надає найбільш послідовну підтримку для них.
Отримання доступу до веб-сокетів
Для використання веб-сокетів на веб-сервері вашого сайту повинна виконуватися спеціальна програма, яка буде, як очікується, називатися сервером веб-сокетів. На цю програму покладається відповідальність за координування взаємодії всіх учасників, і після запуску вона працює безупинно.
Багато хостингові компанії не допускають довго працюючих програм, якщо тільки ви не сплатите виділений веб-сервер, тобто сервер, що обслуговує лише ваш сайт. Якщо у вас звичайний загальний хостинг, ви, швидше за все, не зможете розміщувати на ньому сторінки, в яких використовуються веб-сокети. Навіть якщо ви примудрилися запустити сервер веб-сокетів і утримувати його в робочому стані, власник вашого хостингу, швидше за все, виявить і вимкне його.
Щоб дати вам уявлення про масштаб сервера веб-сокетів, розгляньте деякі із завдань, які сервер сокетов повинен виконувати:
скласти "словник" повідомлень, іншими словами, вирішити, які типи повідомлень є допустимими, а які ні;
містити список всіх поточних підключених клієнтів;
виявляти помилки при відправці повідомлень клієнтам і припинити спроби зв'язатися з ними, якщо здається, що їх більше не існує;
обробляти всі дані в оперативній пам'яті, тобто дані, доступ до яких може знадобитися всім клієнтам, і робити це надійно і безпечно. Тут є велика кількість можливих неявних проблем, наприклад, коли один клієнт намагається приєднатися до обміну, в той час як інший відключається, а інформація про обох зберігається в одному і тому ж об'єкті в пам'яті.
Іншим підходом буде взяти чийсь код сервера веб-сокетів і підігнати його під свої вимоги. В даний час існує безліч проектів (багато з яких безкоштовні і з відкритим кодом), в яких розробляються сервери веб-сокетів для вирішення різних завдань, на різних мовах серверного програмування.
Простий клієнт веб-сокетів
З точки зору веб-сторінки функціональність веб-сокетів легко зрозуміти і використовувати. Перший крок - це створити об'єкт WebSocket і передати йому URL. Код для цього подібний наступного:
Рядок URL починається з тексту ws: //, який ідентифікує підключення типу веб-сокет. Цей URL вказує файл веб-додатки на сервері (в даному випадку це сценарій socketServer.php).
Веб-сокети можуть підключатися не тільки до свого веб-сервера. Веб-сторінка може відкрити підключення до сервера веб-сокетів, виконуючий на іншому веб-сервері, не вимагаючи для цього ніяких додаткових зусиль.
Саме обставина створення об'єкта WebSocket примушує сторінку намагатися підключитися до сервера. Далі треба використовувати одне з чотирьох подій об'єкта WebSocket: onOpen (при встановленні підключення), onError (коли виникає помилка), onClose (при закритті підключення) і onMessage (коли сторінка отримує повідомлення від сервера):
Наприклад, в разі успішного підключення непогано б відправити відповідне повідомлення про підтвердження. Таке повідомлення доставляється за допомогою методу send () об'єкта WebSocket, якому в якості параметра передається звичайний текст. Далі приведена функція, яка обробляє подія onopen і відправляє повідомлення:
Імовірно, веб-сервер отримає це повідомлення і дасть на нього відповідь.
Якщо веб-сторінка вирішить, що вся її робота виконана, вона може закрити з'єднання, використовуючи метод disconnect ().
З цього огляду веб-сокетів можна бачити, що використання сервера веб-сокетів стороннього розробника не представляє ніяких труднощів - нам потрібно лише знати, які повідомлення відправляти, а які - очікувати.
Щоб змусити підключення веб-сокетів працювати, виконується великий обсяг роботи за лаштунками. Перш за все, веб-сторінка встановлює зв'язок по звичайному стандарту HTTP. Потім це підключення потрібно підвищити до підключення веб-сокетів, що дозволяє вільну двосторонній зв'язок. На цьому етапі можливі проблеми, якщо між комп'ютером клієнта і веб-сервером знаходиться проксі-сервер (як, наприклад, в типовій корпоративної мережі). Проксі-сервер може відмовитися співпрацювати і розірве підключення. Цю проблему можна вирішити, виявляючи невдале підключення (за допомогою події onError об'єкта WebSocket) і застосовуючи один з наповнювачів (polyfills) для гнізд, описаних на веб-сайті GitHub. Ці наповнювачі застосовують метод опитування, щоб емулювати підключення веб-сокетів.
Приклади веб-сокетів в мережі
Якщо ви зацікавлені випробувати веб-сокети, в мережі є багато сайтів, на яких можна запустити свою розробку.
Для початку спробуйте сайт websocket.org. який надає найпростіший сервер веб-сокетів: веб-сторінка відправляє йому повідомлення, а він повертає це ж повідомлення веб-сторінці:

Хоча цей сервер веб-сокетів і не представляє нічого особливого, на ньому ви можете випробувати всі можливості об'єкта WebSocket. Більш того, до цього сервера можна підключитися зі сторінки, розташованої як на промисловому веб-сервері, так і на тестовому веб-сервері на вашому комп'ютері, або навіть зі сторінки, просто запускається з жорсткого диска:
Існують і сервери веб-сокетів, що надають інші можливості, включаючи наступні:
Простий чат. Чат, в якому всі розмовляють з усіма. Надсилаються отримують всі учасники чату.
Розрахований на багато користувачів альбом. Ця сторінка об'єднує веб-сокети з HTML5 Canvas. Те, що ви малюєте на своєму полотні, відображається на полотні інших учасників, і навпаки. Простий концепт, але дуже вражаючий на практиці.
Сервери веб-сокетів
Щоб мати можливість випробувати свій проект по веб-сокетів, вам потрібен сервер веб-сокетів, з яким ваша сторінка могла б спілкуватися. Тестовий сервер можна знайти в багатьох місцях. Нижче даються посилання на сервери веб-сокетів для певних серверних мов:
Цей простий і злегка сируватий проект буде гарною відправною точкою для створення сервера веб-сокетів на PHP.
Існує кілька зразків сервера веб-сокетів на Ruby, але цей, що застосовує модель "Event-Machine", користується особливою популярністю.
Сервер веб-сокетів у вигляді модуля розширення для Apache на мові Python.
Назвати простим цей всеохоплюючий проект не можна. Але він містить завершений сервер веб-сокетів на мові C # на основі платформи .NET корпорації Microsoft.
За своїм масштабом цей проект схожий на проект .NET, але чисто на мові Java.