WebSocket — это протокол, используемый для установления двустороннего соединения в реальном времени между веб-приложением и сервером.
Он обеспечивает постоянные соединения через одно TCP-соединение, что позволяет веб-приложениям доставлять данные в более реальном времени.
Протокол WebSocket был первоначально разработан W3C и стал стандартом в 2011 году.
К преимуществам WebSocket относятся:
К недостаткам WebSocket относятся:
Протокол WebSocket — это протокол на основе TCP, используемый для установления постоянного соединения между клиентом и сервером и позволяющий обмениваться данными по этому соединению в режиме реального времени. Протокол WebSocket имеет собственный протокол установления соединения и собственный формат передачи данных.
Когда клиент отправляет запрос WebSocket, сервер отправляет ответ протокола для подтверждения запроса. Во время рукопожатия клиент и сервер согласовывают используемую версию протокола, поддерживаемые подпротоколы, поддерживаемые параметры расширения и т. д. После завершения рукопожатия соединение остается открытым, и клиент и сервер могут передавать данные по соединению в режиме реального времени.
Протокол WebSocket использует двустороннюю передачу данных, то есть и клиент, и сервер могут отправлять данные друг другу в любое время, не дожидаясь запроса другой стороны. Он поддерживает двоичные и текстовые данные и может свободно конвертировать их.
Короче говоря, протокол WebSocket — это надежный, эффективный, двусторонний и долговечный протокол связи. Он подходит для веб-приложений, требующих связи в реальном времени, таких как онлайн-игры, чат в реальном времени и т. д.
Жизненный цикл WebSocket описывает процесс соединения WebSocket от создания до закрытия. Соединение WebSocket состоит из следующих четырех основных этапов:
«Следует отметить, что соединение WebSocket может быть закрыто в любой момент. Например, сбой сети, сбой сервера и т. д. может привести к закрытию соединения. Поэтому необходимо обрабатывать событие закрытия соединения WebSocket в своевременно для обеспечения надежности и стабильности приложения.
Ниже приведена простая диаграмма жизненного цикла WebSocket:
На этой схеме клиент отправляет серверу запрос на подтверждение связи WebSocket, сервер отвечает ответом на подтверждение установления соединения, и соединение устанавливается.
Как только соединение установлено, клиент и сервер могут отправлять данные друг другу по соединению до тех пор, пока одна из сторон не отправит кадр закрытия для закрытия соединения.
После получения кадра закрытия соединение закрывается, а соединение WebSocket закрывается.
Формат сообщения WebSocket отличается от формата HTTP-запросов и ответов.
Формат сообщения WebSocket может представлять собой текстовые или двоичные данные, а передача сообщений WebSocket выполняется по уже установленному соединению, поэтому нет необходимости выполнять операцию установления связи HTTP-запроса и ответа.
Формат сообщения WebSocket состоит из двух частей: заголовка и тела сообщения.
Заголовок сообщения содержит следующую информацию:
Тело сообщения — это фактически передаваемые данные, которые могут быть текстовыми или двоичными.
API WebSocket — это набор интерфейсов для создания соединений WebSocket и управления ими в веб-приложениях. API WebSocket изначально поддерживается браузером и может использоваться непосредственно в JavaScript без использования дополнительных библиотек или платформ JavaScript.
Вот некоторые часто используемые API WebSocket:
WebSocket Конструктор: WebSocket Конструктор используется для создания WebSocket объект. он принимает URL В качестве параметра он представляет WebSocket Адрес сервера. Например:
let ws = new WebSocket('ws://example.com/ws');
WebSocket.send() метод: WebSocket.send()
Метод используется для отправки данных на сервер. Он принимает параметр, представляющий данные для отправки. Данные могут быть строковыми или Blob. объект или ArrayBuffer объект. Например:
ws.send('Hello, server!');
WebSocket.onopen событие: WebSocket.onopen
событие в WebSocket Срабатывает, когда соединение успешно установлено. Например:
ws.onopen = function() {
console.log('WebSocket Соединение установлено. ');
};
WebSocket.onmessage событие: WebSocket.onmessage
событие в Срабатывает при получении сообщения, отправленного сервером. это из event Объект содержит data Свойства, представляющие полученные данные. Например:
ws.onmessage = function(event) {
console.log('Получено сообщение сервера:', event.data);
};
WebSocket.onerror событие: WebSocket.onerror
событие в WebSocket Запускается при возникновении ошибки соединения. Например:
ws.onerror = function(event) {
console.error('WebSocket Ошибка подключения: ', event);
};
WebSocket.onclose событие: WebSocket.onclose
событие в WebSocket Вызывается при закрытии соединения. Например:
ws.onclose = function() {
console.log('WebSocket Соединение закрыто. ');
};
Выше приведены некоторые часто используемые API WebSocket.
полагаться:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
Ниже приведен пример кода для написания сервера WebSocket с использованием API Java WebSocket:
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
@ServerEndpoint("/echo")
public class EchoServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket Соединение установлено. ");
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("Получено клиентское сообщение:" + message);
session.getBasicRemote().sendText("Сервер получил сообщение:" + message);
}
@OnClose
public void onClose() {
System.out.println("WebSocket Соединение закрыто. ");
}
@OnError
public void onError(Throwable t) {
System.out.println("WebSocket Ошибка подключения: " + t.getMessage());
}
}
В этом примере кода определяется конечная точка WebSocket с именем «echo», которая прослушивает сообщения от клиента и возвращает полученные сообщения клиенту.
В частности, он использует @ServerEndpoint
аннотация для указания WebSocket конечная точка URL, использованный @OnOpen
、@OnMessage
、@OnClose
и @OnError
аннотация для определения WebSocket обработчик событий.
Чтобы использовать этот сервер WebSocket, нам необходимо развернуть его в веб-контейнере, поддерживающем WebSocket.
Например, мы можем использовать Tomcat 8 или выше для его запуска. После завершения развертывания мы можем использовать любой клиент, поддерживающий WebSocket, для подключения к этому серверу, отправки сообщений и получения ответов от сервера.
Например, вот простой клиентский код HTML/JavaScript:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocket Demo</title>
<script>
var ws = new WebSocket('ws://localhost:8080/echo');
ws.onopen = function() {
console.log('WebSocket Соединение установлено. ');
ws.send('Hello, server!');
};
ws.onmessage = function(event) {
console.log('Получено сообщение сервера:', event.data);
};
ws.onerror = function(event) {
console.error('WebSocket Ошибка подключения: ', event);
};
ws.onclose = function() {
console.log('WebSocket Соединение закрыто. ');
};
</script>
</head>
<body>
<h1>WebSocket Demo</h1>
</body>
</html>
Этот клиент использует конструктор WebSocket для создания объекта WebSocket и указывает URL-адрес подключения как URL-адрес сервера, который мы развернули ранее.
Он использует обработчик событий WebSocket для обработки событий WebSocket. Например, когда соединение WebSocket успешно установлено, он отправит сообщение на сервер и распечатает содержимое сообщения при получении ответа от сервера.
Вот пример кода для написания клиента WebSocket с использованием API Java WebSocket:
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
@ClientEndpoint
public class EchoClient {
private Session session;
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket Соединение установлено. ");
this.session = session;
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Получено сообщение сервера:" + message);
}
@OnClose
public void onClose() {
System.out.println("WebSocket Соединение закрыто. ");
}
@OnError
public void onError(Throwable t) {
System.out.println("WebSocket Ошибка подключения: " + t.getMessage());
}
public void connect(String url) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, new URI(url));
}
public void send(String message) throws IOException {
session.getBasicRemote().sendText(message);
}
public void close() throws IOException {
session.close();
}
}
первый,Вам необходимо создать новыйизSpring Bootпроект。Может Использование Spring Initializr создает новый проект, добавляя зависимости.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Требуется приложение, настройка веб-сокета.
Создайте новый класс Java.,и добавляйте комментарии@ServerEndpoint("/websocket")
。Это укажетWebSocketСерверизконечная точка。
На этом занятии необходимо реализовать несколько задач:
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connection opened: " + session.getId());
sessions.add(session);
}
@OnMessage
public void onMessage(Session session, String message) throws IOException {
System.out.println("Received message: " + message);
session.getBasicRemote().sendText("Server received: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("Connection closed: " + session.getId());
sessions.remove(session);
}
private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
}
существовать@OnMessage
в методе,Может обрабатывать отправку сообщений клиентами WebSocket.,и отправить ответ клиенту. Ниже приведен простой пример кода:
@OnMessage
public void onMessage(Session session, String message) throws IOException {
System.out.println("Received message: " + message);
session.getBasicRemote().sendText("Server received: " + message);
}
В этом коде мы просто распечатываем полученное сообщение и отправляем ответ клиенту.
существовать@OnClose
в методе,Вы можете удалить соединение и выполнить некоторую очистку. Вот пример кода:
@OnClose
public void onClose(Session session) {
System.out.println("Connection closed: " + session.getId());
sessions.remove(session);
}
В этом коде мы удаляем соединение из пула соединений и распечатываем сообщение о закрытии соединения.
Наконец, вам нужно настроить Spring BootкподдерживатьWebSocket。Создайте новый класс Java.,и добавляйте комментарии@Configuration
и@EnableWebSocket
。Затем,Необходимо переопределить методregisterWebSocketHandlers()
,и укажите обработчик WebSocket. Вот пример кода:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketServer(), "/websocket").setAllowedOrigins("*");
}
}
в этом коде,Мы создали новыйизWebSocketServer
объект,и добавьте его вWebSocketОбработка。Мы также уточнилиWebSocketконечная точка(/websocket
)ипозволятьизисточник(*
)。
Текстовые сообщения представляют собой простые текстовые строки в формате Unicode. Когда соединение WebSocket установлено,клиентисервер Можетотправив текстинформацияобмениваться информацией друг с другом。сервер МожетиспользоватьSessionобъектизgetBasicRemote()
Метод отправки текстового сообщения клиенту,клиент МожетиспользоватьWebSocketизsend()
Метод отправки текстового сообщения на сервер。
Вот пример кода для отправки текстового сообщения клиенту:
session.getBasicRemote().sendText("Hello, client!");
Двоичные сообщения могут представлять собой данные любого типа.,Включая изображения, аудио, видео и т. д. Чтобы отправить двоичное сообщение клиенту,сервер МожетиспользоватьSessionобъектизgetBasicRemote()
метод,Отправьте сообщение как объект ByteBuffer. Клиент может отправлять двоичные сообщения на сервер с помощью метода send() WebSocket.
Вот пример кода для отправки двоичного сообщения клиенту:
byte[] data = // binary data
ByteBuffer buffer = ByteBuffer.wrap(data);
session.getBasicRemote().sendBinary(buffer);
пожалуйста, обрати внимание,Хотя текстовые сообщения и двоичные сообщения различаются по формату,Но все они отправляют сообщения разных типов через WebSocket.,Следовательно, и клиент, и сервер должны иметь возможность обрабатывать оба типа сообщений.
WebSocket также поддерживает тип сообщения PingиPong, который используется для определения того, активно ли соединение WebSocket.
Сообщения Ping отправляются клиентом на сервер, а сообщения Pong отправляются обратно клиенту сервером в ответ.
Если клиент не получает сообщение Pong в течение определенного периода времени, он может предположить, что соединение WebSocket разорвано, и закрыть соединение.
Чтобы отправить сообщение Ping,пожалуйстаиспользоватьSessionобъектизgetBasicRemote()
метод,И отправьте сообщение Ping как объект ByteBuffer.
клиент МожетиспользоватьWebSocketизsendPing()
метод来向сервер发送Pingинформация。
Вот пример кода для отправки сообщения Ping клиенту:
ByteBuffer pingMessage = ByteBuffer.wrap(new byte[] { 8, 9, 10 });
session.getBasicRemote().sendPing(pingMessage);
Чтобы получать сообщения Pong,пожалуйстасуществоватьтыизWebSocketОбработкавыполнитьonPong()
метод。
Когда ваш сервер WebSocket получает сообщение Pong, он автоматически вызывает этот метод и передает ему полученное сообщение Pong как объект ByteBuffer.
Ниже приведен пример кода, реализующего метод onPong():
@OnMessage
public void onPong(Session session, ByteBuffer pongMessage) {
System.out.println("Received Pong message: " + pongMessage);
}
пожалуйста, обрати внимание,Сообщения PingиPong обычно используются для проверки работоспособности соединения WebSocket.
Если вы хотите использовать эту функцию с соединением WebSocket, вам следует периодически отправлять сообщения Ping и ждать ответа от сообщений Pong.
WebSocketвозвращатьсяподдерживать Закрыть сообщениетип,используется для Закрыть соединение WebSocket。
Закрыть Сообщение может быть инициировано клиентом или сервером и может содержать необязательный код состояния и причину закрытия. Когда соединение WebSocket закрывается, и клиент, и сервер должны отправить сообщение Закрыть. сообщение, чтобы завершить соединение.
отправить Закрыть сообщение,пожалуйстаиспользоватьSessionобъектизgetBasicRemote()
метод,и назови этоизsendClose()
метод。
Закрыть сообщение может содержать необязательный код статуса и причину закрытия. Если вы не хотите, чтобы код состояния или причина завершения работы отправлялись, вы можете установить для них значение 0–null.
Вот пример кода для отправки клиенту сообщения о завершении работы:
session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "Closing from client."));
Обработать полученное из Закрыть сообщение,пожалуйстасуществоватьтыизWebSocketОбработкавыполнитьonClose()
метод。
Когда ваш сервер изWebSocket получит Закрыть сообщениечас,Он автоматически вызовет этот метод,И передайте ему полученный код статуса и причину закрытия.
Вот реализацияonClose()
методиз Пример кода:
@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Connection closed: " + closeReason.getCloseCode() + " - " + closeReason.getReasonPhrase());
}
пожалуйста, обрати внимание,клиенти Сервер должен отправить Закрыть сообщение, чтобы завершить соединение WebSocket.
Если только одна сторона отправляет сообщение о закрытии, другая сторона может не закрыть соединение должным образом, и ей, возможно, придется дождаться тайм-аута, прежде чем ресурсы будут освобождены.
Рекомендуется, чтобы и клиент, и сервер отправляли Закрыть сообщение при закрытии соединения, чтобы убедиться, что соединение закрыто правильно.
Протокол WebSocket работает лучше, чем традиционная модель HTTP-запроса/ответа.,Особенно с точки зрения связи в реальном времени и низкой задержки. Протокол WebSocket подходит для приложений, которым требуется связь в реальном времени и обновление данных в реальном времени.,нравитьсясуществоватьонлайн-чат、Мультиплеер、Мониторинг в реальном времени и т. д.
И последнее слово (обратите внимание! Не занимайтесь блудством зря!)
Если эта статья оказалась для вас полезной или вдохновляющей, нажмите три раза: «Мне нравится», «Переслать» и «Читать».
сосредоточиться на Официальный аккаунт:woniuxgg,существовать Официальный аккаунт Ответить в:примечания Вы можете получить практические заметки по Java, тщательно подготовленные для вас компанией Snail, ответить на интервью, получить руководства по разработке и получить потрясающие преимущества для поклонников!