HTML5 представил много новых интересных API, включая WebSockets. WebSockets позволяют разработчикам создавать мощные приложения в реальном времени, устанавливая сокет-соединения между браузером и сервером. Другими словами, и клиент, и сервер могут обмениваться данными в любое время из-за постоянного соединения. В этом руководстве объясняется, как использовать WebSockets для создания веб-приложений в реальном времени.
Проблема
В приложениях реального времени соединение между сервером и клиентом должно быть постоянным. Таким образом, для создания иллюзии инициируемой сервером передачи обычно используется длительный опрос. WebSockets решают эту проблему путем установления постоянного сокетного соединения между клиентом и сервером. Как только соединение установлено, оно остается открытым, пока клиент или сервер не захочет закрыть его. Это значительно снижает нагрузку на сервер и лучше всего подходит для приложений с низкой задержкой.
Начиная
Открыть соединение через WebSocket довольно просто. Вам просто нужно вызвать конструктор WebSocket()
для создания соединения.
var connection=new WebSocket("ws://localhost:8787",['soap','json']);
ws:
и wss:
являются схемами URL для нормальных и защищенных соединений WebSocket, соответственно. Второй параметр используется для определения имени подпротокола, которое может быть массивом строк или строкой. Тем не менее, сервер будет принимать только один суб-протокол. В течение срока действия соединения браузер получит несколько событий, таких как открытое соединение, полученное сообщение и закрытое соединение. Для обработки этих событий используйте следующий код:
var connection=new WebSocket("ws://localhost:8787",'json'); connection.onopen = function () { connection.send('Hello, Server!!'); //send a message to server once connection is opened. }; connection.onerror = function (error) { console.log('Error Logged: ' + error); //log errors }; connection.onmessage = function (e) { console.log('Received From Server: ' + e.data); //log the received message };
Как только соединение открыто, браузер отправляет сообщение на сервер с помощью connection.send()
. Если обнаружена ошибка, приведенный выше код просто регистрирует ее. Если в любое время сервер отправляет сообщение в браузер, onmessage
обратный вызов onmessage
. Обработчик события получает объект события со свойством data
объекта, содержащего полученное сообщение.
Метод connection.send()
может использоваться для отправки двоичных данных. Для этого вы можете использовать Blob
или ArrayBuffer
. Следующий код демонстрирует использование ArrayBuffer
для отправки изображения, нарисованного на холсте, на сервер.
var image = canvas2DContext.getImageData(0, 0, 440, 300); var binary_data = new Uint8Array(image.data.length); for (var i = 0; i < image.data.length; i++) { binary_data[i] = image.data[i]; } connection.send(binary_data.buffer);
Точно так же полученное сообщение может быть строкой или двоичными данными. Двоичные данные могут быть получены в виде arraybuffer
или arraybuffer
.
Простое приложение WebSocket
Чтобы создать работающее приложение, вам также нужна реализация на стороне сервера. Для создания реализации на стороне сервера можно использовать такие технологии, как node.js, Java, .NET, Ruby или C ++. Этот раздел покажет вам, как создать простое приложение с помощью WebSockets.
Пример приложения позволит пользователю задавать конкретные вопросы серверу. Реализация на стороне сервера выполняется с использованием инфраструктуры Java jWebSocket в Windows 7. Итак, чтобы настроить среду, выполните следующие простые шаги. Я предполагаю, что вы уже установили последнюю версию JDK (JDK 7) на ПК с Windows 7.
Шаг 1
Перейдите в раздел «Загрузки jWebSocket» и загрузите первый zip-файл, помеченный как сервер.
Шаг 2
Разархивируйте архив и поместите его где-нибудь в свой C :. Затем создайте новую переменную среды с именем JWEBSOCKET_HOME , которая ссылается на корень вашей установки jWebSocket. Это путь к папке jWebSocket-1.0. Добавьте следующие JAR-файлы в ваш путь к классу:
- JWEBSOCKET_HOME / ЛИЭС / jWebSocketServer-1.0.jar
- JWEBSOCKET_HOME / ЛИЭС / jWebSocketServerAPI-1.0.jar
- JWEBSOCKET_HOME / ЛИЭС / jWebSocketCommon-1.0.jar
Шаг 3
Создайте новый исходный файл Java и назовите его SocketListener.java
. Добавьте следующий код в этот файл.
import java.util.Date; import java.text.SimpleDateFormat; import org.jwebsocket.factory.JWebSocketFactory; import org.jwebsocket.server.TokenServer; import org.jwebsocket.kit.WebSocketServerEvent; import org.jwebsocket.api.WebSocketServerListener; import org.jwebsocket.api.WebSocketPacket; import org.jwebsocket.config.JWebSocketConfig; import org.jwebsocket.instance.JWebSocketInstance; class JWebSocketListener implements WebSocketServerListener { public void processOpened(WebSocketServerEvent event) { System.out.println("Connection Opened"); } public void processPacket(WebSocketServerEvent event, WebSocketPacket packet) { switch(packet.getString()){ case "1": packet.setString("My Name is jWebSocketServer"); break; case "2": packet.setString("Windows 7 64 Bit"); break; case "3": SimpleDateFormat sdf=new SimpleDateFormat("hh:mm:ss"); packet.setString(sdf.format(new Date())); break; } event.sendPacket(packet); } public void processClosed(WebSocketServerEvent event) { } } public class SocketListener{ public static void main(String[] args){ JWebSocketFactory.printCopyrightToConsole(); JWebSocketConfig.initForConsoleApp(new String[]{}); JWebSocketFactory.start(); TokenServer server = (TokenServer)JWebSocketFactory.getServer("ts0"); if(server!=null) { server.addListener(new JWebSocketListener()); } while (JWebSocketInstance.getStatus() != JWebSocketInstance.SHUTTING_DOWN){ try { Thread.sleep(250); } catch (InterruptedException e) { } } } }
объяснение
Код реализует интерфейс WebSocketServerListener
. Интерфейс объявляет следующие три метода, которые должны быть реализованы в нашем классе, JWebSocketListener
.
-
processOpened()
-
processPacket()
-
processClosed()
processOpened()
вызывается после открытия соединения. Примером использования этого будет запуск потока, который регулярно отправляет обновления клиенту. Точно так же processClosed()
вызывается, когда соединение закрывается, чтобы вы могли выполнить любые очистки.
В нашем приложении основная обработка выполняется в processPacket()
. Этот метод вызывается всякий раз, когда браузер отправляет сообщение на сервер. Он получает два объекта, типа WebSocketServerEvent
и WebSocketPacket
. Сначала мы используем WebSocketPacket#getString()
для чтения сообщения (это вопрос, заданный клиентом). В зависимости от вопроса сервер отправляет ответ. WebSocketPacket#setString()
WebSocketPacket
с помощью WebSocketPacket#setString()
. Затем мы вызываем WebSocketServerEvent#sendPacket()
, передавая пакет в качестве аргумента. Далее мы создаем открытый класс с именем SocketListener
. Этот класс запускает сервер реализации WebSocket и регистрирует наш пользовательский слушатель на нем.
Шаг 4
Скомпилируйте SocketListener.java
и запустите свой сервер с помощью команды java SocketListener
.
Шаг 5
Теперь, когда вы выполнили реализацию на стороне сервера, пришло время создать клиент, который будет взаимодействовать с сервером. Вот наша первоначальная HTML-разметка:
<html> <head> <title>WebSocket Test</title> <style> #response{ width: 200px; background: #F2F2F2; padding: 120px 0px 120px 0px; font-size:18px; } </style> </head> <body> <div align="center"> Choose a question to ask: <select id="question" name="question" onchange="sendMessage(this.value);"> <option value="1">What's Your Name</option> <option value="2">Which OS You Are Running On?</option> <option value="3">What Time Is It?</option> </select> <br/><br/> <div id="response"> My Name is jWebSocketServer </div> </div> </body> </html>
Теперь добавьте следующий код JavaScript в HTML:
<script type="text/javascript"> var connection = new WebSocket('ws://localhost:8787', 'json'); connection.onopen = function () { console.log('Connection Opened'); }; connection.onerror = function (error) { console.log('WebSocket Error ' + error); }; connection.onmessage = function (e) { if(e.data.indexOf("subProtocol")==-1) document.getElementById("response").innerHTML=e.data+"<br/>"; }; function sendMessage(msg){ connection.send(msg); } </script>
объяснение
Мы создали файл HTML, который позволяет пользователям выбирать вопросы из выпадающего меню. Когда происходит событие onchange
, мы берем значение выбранного элемента и отправляем это значение на сервер. Затем сервер обрабатывает запрос и отправляет ответ браузеру. Когда сообщение от сервера получено, onmessage
обратный вызов onmessage
, который показывает ответ в response
<div>
. Строка if(e.data.indexOf("subProtocol")==-1)
не является обязательной. Я включил его, потому что изначально, когда соединение открыто, сервер отправляет длинную строку, содержащую информацию, в браузер. Поскольку мы не хотим показывать эту строку, я включил вышеупомянутое условие.
Примечание. Не открывайте этот HTML-файл напрямую. Поместите его на localhost
сервер, а затем получите доступ к нему в браузере.
Вывод
Используя API WebSocket, вы можете создавать очень мощные приложения в реальном времени. Но имейте в виду, что обмен данными между источниками разрешен WebSockets. Поэтому вам следует общаться только с теми серверами и клиентами, которым вы доверяете. Ниже приведены несколько примеров приложений, которые вы можете создать с помощью этого API:
- Обновление Социального потока в реальном времени
- HTML5 многопользовательские игры
- Приложения для онлайн чата
Посетите Mozilla Developer Network, чтобы узнать больше об API WebSockets.