SpringBoot интегрирует отправку сообщений через веб-сокет в режиме реального времени
SpringBoot интегрирует отправку сообщений через веб-сокет в режиме реального времени

SpringBoot интегрирует отправку сообщений через веб-сокет в режиме реального времени

WebSocket — это протокол, обеспечивающий двустороннюю связь в веб-приложениях. Он позволяет устанавливать постоянные соединения между клиентами и серверами и поддерживает двунаправленную передачу данных, обеспечивая связь в реальном времени с малой задержкой.

📍Распространенные методы отправки сообщений

  1. WebSocket:ИспользуяWebSocketпротокол,Двусторонняя связь может быть достигнута в серверной части Java.,Это обеспечивает обмен сообщениями в режиме реального времени. Вы можете использовать WebSocket в Java API или используйте библиотеки с открытым исходным кодом, такие как поддержка Tomcat WebSocket, Spring WebSocket и т. д. для реализации.
  2. Server-Sent Events (SSE):SSEэто своего родаHTTPлегкий сервер Толкатьтехнология,Это позволяет серверу отправлять односторонние сообщения Толката клиенту. В бэкэнде Java,Для поддержки SSE можно использовать сервлет или реализацию на основе платформы.
  3. очередь сообщений:Используяочередь такие сообщения, как RabbitMQ, ActiveMQ или Kafka и т. д.,Серверная часть Java может публиковать сообщения в очереди сообщений,Затем клиент получает сообщения в режиме реального времени Толкать, подписываясь на очередь сообщений.
  4. Короткий опрос (Длинный Polling):То есть браузер регулярно отправляет запросы на сервер.,Как обновить данные. Как показано на рисунке ниже, принцип заключается в том, что клиент непрерывно отправляет запросы на сервер.,Если данные сервера обновлены,Сервер отправляет данные обратно,клиент сможет получать новые данные
  5. Длинный опрос (Длинный Polling):Хоть и отличается от реального времени Толкать,Но длинный опрос — это метод, имитирующий Толкать в реальном времени. В бэкэнде Java,Вы можете реализовать длинный механизм опроса, чтобы добиться чего-то вроде режима реального времени.Толкать Эффект。 Выше приведены некоторые распространенные методы Java-сервера для реализации напоминаний о сообщениях в реальном времени. Каждый метод имеет свои применимые сценарии и характеристики.

📍Введение зависимостей

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

📍Класс конфигурации WebSocketConfig

Язык кода:javascript
копировать
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();
    }
}

📍Класс сервера WebSocketServer

Язык кода:javascript
копировать
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);
    }
 
}

📍Код реализации внешнего интерфейса

  • Способ 1. Используйте онлайн-клиент WebSocket. использование клиентской страницы http://www.jsons.cn/websocket/ Создавайте вместе с проектом, взаимодействуйте, действуйте как веб-клиент
  • Способ 2: Напишите сами
Язык кода:javascript
копировать
<!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>
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose