WebSocket — неотъемлемая технология многих современных веб-приложений. Если вы пишете код для Интернета, вы, вероятно, слышали этот термин раньше, но, возможно, вы не уверены, что это такое и как его использовать. К счастью, WebSocket не является сложной концепцией, и вы можете довольно быстро получить общее представление о ней.
Что такое веб-сокет?
WebSocket, к сожалению, является одним из тех имен, которые на первый взгляд кажутся бессмысленными. WebSocket на самом деле является именем протокол связи что обеспечивает двунаправленную связь между клиентом и веб-сервером.
Проще говоря, WebSocket — это технология, которая позволяет клиенту и серверу создавать соединение, при котором одна из сторон может отправить другой сообщение в любое время.
Это отличается от обычного HTTP-соединения, когда клиент должен инициировать запрос, и только после этого сервер может отправить ответ. Фактически, WebSocket — это протокол связи, полностью отличный от HTTP, который был разработан для совместимости с HTTP. Когда клиентское приложение хочет инициировать соединение WebSocket, ему необходимо использовать
Механизм обновления HTTP переключиться на протокол WebSocket.В этот момент вы можете подумать: «Протокол — это просто набор правил, как вы можете использовать его для кодирования?».
Недостающая часть называется стек протоколов. По сути, устройства, поддерживающие протокол, имеют встроенное аппаратное и программное обеспечение, которое позволяет вам писать приложения, взаимодействующие с использованием протокола. Протокол не используется напрямую для создания чего-либо.
Почему был создан WebSocket?
Чтобы проиллюстрировать необходимость WebSocket, рассмотрим механизм общения в Интернете.
Кто-то отправляет сообщение на сервер чата со своего устройства, но сервер все равно должен отправить это сообщение на ваше устройство, прежде чем вы сможете его прочитать. Если сервер использует HTTP, сервер не может напрямую переслать вам это сообщение, поскольку сервер не может инициировать запросы.
Есть несколько способов решить эту проблему с HTTP. Один из способов заключается в том, чтобы клиент постоянно отправлял серверу запросы на обновление, а сервер пересылал любые данные, содержащиеся в ответе. Этот метод называется опросом, а каждый запрос называется опросом. Существует два варианта опроса: длинный опрос и короткий опрос.
Использование варианта длинного опроса означает, что клиентское устройство постоянно спрашивает сервер, доступны ли какие-либо новые сообщения. Если доступны новые сообщения, сервер отправит сообщения в качестве ответа. В противном случае сервер будет задерживать ответ и удерживать открытое соединение до тех пор, пока у него не будет данных для отправки обратно, а затем клиент немедленно сделает новый запрос.
Этот метод неэффективен, поскольку HTTP не предназначен для такого использования. Он адекватно работает в небольших масштабах, но каждый HTTP-запрос требует отправки дополнительных данных в заголовок, и это приводит к значительному увеличению нагрузки на сервер, когда многие клиенты опрашивают Это.
Вот диаграмма, иллюстрирующая длительный опрос:
Вариант с коротким опросом еще менее эффективен. При коротком опросе сервер не удерживает соединение открытым до тех пор, пока не появятся новые данные, а это означает, что клиент должен продолжать опрашивать сервер с фиксированными, очень короткими интервалами.
Другой метод двунаправленной связи в HTTP называется потоковой передачей.
При потоковой передаче после отправки первого запроса сервер удерживает соединение открытым неопределенное время, отправляя клиенту новые фрагменты информации в виде непрерывных частичных ответов.
Использование потоковой передачи приводит к меньшим накладным расходам данных и нагрузке на сервер, чем опрос, поскольку в идеале клиент делает только один HTTP-запрос. К сожалению, при определенных условиях потоковая передача создает проблемы, поскольку браузеры и сетевые посредники (например, прокси-серверы) часто пытаются справиться с частичные ответы как фрагменты одного большого HTTP-ответа (что является нормальным поведением HTTP), а не как отдельные сообщения, для которых они предназначены. быть.
WebSocket был создан для решения этих проблем. В отличие от HTTP, WebSocket был разработан специально для двунаправленной связи. С помощью WebSocket после открытия соединения клиент и сервер могут отправлять сообщения туда и обратно без проблем с опросом или потоковой передачей.
Примеры использования WebSocket
WebSocket — это хорошо, но это не значит, что его нужно использовать везде.
Внедрение WebSocket может усложнить ваше приложение, особенно на стороне сервера, поэтому его не следует делать, если у вас нет веской причины. Возникает вопрос: как выглядит веская причина?
WebSocket идеально подходит для случаев, когда требуется частая двусторонняя связь с малой задержкой. Другими словами, WebSocket обеспечивает преимущество для приложений, которым необходимо обмениваться данными часто или в больших масштабах. Если связь не требуется в режиме реального времени или приложение никогда не разрастется до больших масштабов, для использования в этом приложении может быть достаточно опроса или потоковой передачи.
Типичное использование WebSocket — создание чат-приложений, многопользовательских онлайн-игр, программного обеспечения для совместной работы и уведомлений в реальном времени и т. д.
Как использовать WebSocket на стороне клиента
Использование WebSocket на стороне сервера может быть довольно сложным, и процесс существенно различается в зависимости от языка (например, С#, Ява, и т. д.) и выбранной библиотекой, поэтому мы не будем ее здесь рассматривать. Далее мы кратко обсудим, как использовать WebSocket на стороне клиента.
Все современные браузеры реализуют веб-API, называемый API веб-сокетов, который представляет собой стек протоколов браузера для протокола WebSocket. Вы можете использовать WebSocket в JavaScript с помощью этого API. API позволяет вам создать объект WebSocket, с помощью которого вы создаете соединение WebSocket и взаимодействуете с сервером WebSocket.
Вы можете использовать следующий формат кода для создания объекта WebSocket:
пусть exampleSocket = новый WebSocket("wss://www.example.com/socketserver", "фиктивный протокол");
Первый аргумент конструктора — это URI сервера WebSocket, с которым вы хотите создать соединение. Он всегда будет начинаться с «ws» или «wss». Второй аргумент является необязательным. Его значением является либо строка, либо массив строк, указывающий поддерживаемые вами подпротоколы.
Объект WebSocket имеет доступное только для чтения свойство, называемое readyState. Доступ к этому свойству предоставляет текущее состояние соединения WebSocket. readyState имеет четыре возможных значения: «подключение», «открытие», «закрытие» и «закрытие».
Когда эта строка кода запустится, браузер попытается подключиться к указанному серверу. Соединение не будет завершено сразу, поэтому readyState exampleSocket будет «подключением». Никакие сообщения не могут быть отправлены или получены до тех пор, пока соединение не будет установлено, после чего значение readyState станет «открытым».
примерSocket объект имеет прослушиватель событий (который отличается от Слушатели событий DOM) под названием «onopen», что позволяет выполнять дальнейшие действия только после установления соединения. У объекта также есть метод «отправить», который позволяет вам отправлять строки, BLOB-объекты (двоичные данные) и ArrayBuffers в виде сообщений на сервер.
Вот пример их совместного использования:
примерSocket.onopen = функция (мероприятие) {
примерSocket.send("WebSocket это действительно круто");
};
API также предоставляет возможность реагировать на сообщения, отправляемые сервером. Это делается с помощью прослушивателя событий onmessage. Вот пример:
примерSocket.onmessage = функция (мероприятие) {
приставка.журнал(мероприятие.данные);
}
Вместо этого вы также можете написать стрелочная функция:
exampleSocket.onmessage = (событие) => { приставка.log(событие.данные); }
API также предоставляет Закрыть() метод закрытия соединения. Вот как это выглядит:
примерSocket.Закрыть();
WebSocket обеспечивает эффективную двустороннюю связь
WebSocket — это протокол двунаправленной связи. Серверы и браузеры реализуют стеки протоколов для связи с использованием WebSocket. WebSocket существует, потому что HTTP не был разработан для двунаправленности. Существуют методы реализации двунаправленных соединений с HTTP, но у них есть проблемы.
WebSocket — мощная технология, но она необходима не во всех случаях, так как может значительно усложнить архитектуру приложения. Использование WebSocket на стороне клиента осуществляется с помощью API WebSocket браузера.