WebSocket — это протокол, обеспечивающий двустороннюю связь в веб-приложениях. Он позволяет устанавливать постоянные соединения между клиентами и серверами и поддерживает двунаправленную передачу данных, обеспечивая связь в реальном времени с малой задержкой.
WebSocket
:ИспользуяWebSocketпротокол,Двусторонняя связь может быть достигнута в серверной части Java.,Это обеспечивает обмен сообщениями в режиме реального времени. Вы можете использовать WebSocket в Java API или используйте библиотеки с открытым исходным кодом, такие как поддержка Tomcat WebSocket, Spring WebSocket и т. д. для реализации.Server-Sent Events (SSE)
:SSEэто своего родаHTTPлегкий сервер Толкатьтехнология,Это позволяет серверу отправлять односторонние сообщения Толката клиенту. В бэкэнде Java,Для поддержки SSE можно использовать сервлет или реализацию на основе платформы.очередь сообщений
:Используяочередь такие сообщения, как RabbitMQ, ActiveMQ или Kafka и т. д.,Серверная часть Java может публиковать сообщения в очереди сообщений,Затем клиент получает сообщения в режиме реального времени Толкать, подписываясь на очередь сообщений.Короткий опрос (Длинный Polling)
:То есть браузер регулярно отправляет запросы на сервер.,Как обновить данные. Как показано на рисунке ниже, принцип заключается в том, что клиент непрерывно отправляет запросы на сервер.,Если данные сервера обновлены,Сервер отправляет данные обратно,клиент сможет получать новые данныеДлинный опрос (Длинный Polling)
:Хоть и отличается от реального времени Толкать,Но длинный опрос — это метод, имитирующий Толкать в реальном времени. В бэкэнде Java,Вы можете реализовать длинный механизм опроса, чтобы добиться чего-то вроде режима реального времени.Толкать Эффект。
Выше приведены некоторые распространенные методы Java-сервера для реализации напоминаний о сообщениях в реальном времени. Каждый метод имеет свои применимые сценарии и характеристики.<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
package com.yxsd.cnooc.data.wb;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Component
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
package com.yxsd.cnooc.data.service;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @ServerEndpoint Аннотация — это аннотация уровня класса. Ее основная функция — определить текущий класс как сервер веб-сокетов.
* Значение аннотации будет использоваться для отслеживания URL-адреса доступа к терминалу пользователя. Клиент может использовать этот URL-адрес для доступа к серверу WebSocket.
*/
@Component
@ServerEndpoint("/websocket/{userId}")
public class WebSocketTest {
private static ConcurrentHashMap<String, CopyOnWriteArraySet<WebSocketTest>> userwebSocketMap = new ConcurrentHashMap<String, CopyOnWriteArraySet<WebSocketTest>>();
private static ConcurrentHashMap<String, Integer> count = new ConcurrentHashMap<String, Integer>();
private String userId;
/*
* вести разговор с определенным клиентом, через который необходимо отправить данные клиенту
*/
private Session session;
/**
* объединить Установить метод, который успешно вызывается
*
* @param session Дополнительные параметры。sessionдлявести разговор с определенным клиентом, через который необходимо отправить данные клиенту
*/
@OnOpen
public void onOpen(Session session, @PathParam("userId") final String userId) {
this.session = session;
this.userId = userId;
System.out.println("session:"+session);
System.out.println("userId:"+userId);
if (!exitUser(userId)) {
initUserInfo(userId);
} else {
CopyOnWriteArraySet<WebSocketTest> webSocketTestSet = getUserSocketSet(userId);
webSocketTestSet.add(this);
userCountIncrease(userId);
}
System.out.println("Да" + userId + "Новое соединение присоединилось! Текущее количество людей онлайн" + getCurrUserCount(userId));
}
/**
* совместно закрыть метод, вызываемый
*/
@OnClose
public void onClose() {
CopyOnWriteArraySet<WebSocketTest> webSocketTestSet = userwebSocketMap.get(userId);
//Удалить из набора
webSocketTestSet.remove(this);
//Номер онлайн минус 1
userCountDecrement(userId);
System.out.println("Происходит отключение! Текущее количество людей в сети" + getCurrUserCount(userId));
}
/**
* Метод, вызываемый после получения сообщения клиента
*
* @param message Сообщение отправлено клиентом
* @param session Дополнительные параметры
*/
@OnMessage
public void onMessage(String message, Session session) {
CopyOnWriteArraySet<WebSocketTest> webSocketSet = userwebSocketMap.get(userId);
/* System.out.println("от клиента" + userId + "Сообщение:" + message);
//Групповое сообщение
for (WebSocketTest item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}*/
}
/**
* Вызывается при возникновении ошибки
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("Произошла ошибка");
error.printStackTrace();
}
/**
* Этот метод отличается от вышеописанных методов. Аннотаций нет, просто добавляйте методы в соответствии с вашими потребностями.
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
System.out.println("Сервер Толкать" + userId + "Сообщение:" + message);
this.session.getAsyncRemote().sendText(message);
}
/**
* Этот метод отличается от вышеописанных методов. Аннотаций нет, просто добавляйте методы в соответствии с вашими потребностями. Я был там, когда появились новости об агентстве Вызовите этот интерфейс Отправить сообщение указанному пользователю
*
* @param message
* @throws IOException
*/
public void sendMessage(String userId,String message) throws IOException {
System.out.println("Сервер Толкать" + userId + "Сообщение:" + message);
CopyOnWriteArraySet<WebSocketTest> webSocketSet = userwebSocketMap.get(userId);
//Групповое сообщение
for (WebSocketTest item : webSocketSet) {
try {
item.session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
public boolean exitUser(String userId) {
return userwebSocketMap.containsKey(userId);
}
public CopyOnWriteArraySet<WebSocketTest> getUserSocketSet(String userId) {
return userwebSocketMap.get(userId);
}
public void userCountIncrease(String userId) {
if (count.containsKey(userId)) {
count.put(userId, count.get(userId) + 1);
}
}
public void userCountDecrement(String userId) {
if (count.containsKey(userId)) {
count.put(userId, count.get(userId) - 1);
}
}
public void removeUserConunt(String userId) {
count.remove(userId);
}
public Integer getCurrUserCount(String userId) {
return count.get(userId);
}
private void initUserInfo(String userId) {
CopyOnWriteArraySet<WebSocketTest> webSocketTestSet = new CopyOnWriteArraySet<WebSocketTest>();
webSocketTestSet.add(this);
userwebSocketMap.put(userId, webSocketTestSet);
count.put(userId, 1);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
let webSocket = null; // создать переменную
if ('WebSocket' in window){ // Определите, поддерживает ли текущий браузер WebSocket.
// Если поддерживается, создайте WebSocket и назначьте его только что созданной переменной.
// Следующий путь на самом деле является запросом, но здесь используется протокол WebSocket.
// Запомните это место, а о том, как его написать подробно, мы поговорим позже.
webSocket = new WebSocket('ws://localhost:8080/webSocket');
}else{ // Если он несовместим, появится всплывающее окно. Этот браузер его не поддерживает.
alert('Этот браузер не поддерживает')
}
/**
* Этот метод будет запущен при создании соединения (инициализации) WebSocket.
*/
webSocket.onopen = function (event){
console.log('Учреждатьсоединять') // Это означает печать журналов в браузере, что имеет то же значение, что и Java System.out.println().
}
/**
* Этот метод будет запущен при закрытии WebSocket.
*/
webSocket.onclose = function (event){
console.log('закрытиесоединять') // То же, что и выше
}
/**
* Этот метод срабатывает, когда WebSocket получает сообщение.
*/
webSocket.onmessage = function (event){
console.log('Получено сообщение: '+event.data)
}
/**
* Этот метод срабатывает при возникновении ошибки соединения WebSocket.
*/
webSocket.onerror = function (event){
console.log('ошибка веб-сокета');
}
/**
* Страница закрывается, WebSocket закрывается
*/
window.onbeforeunload = function (){
webSocket.close();
}
</script>
</html>