当前位置:

首页 > 编程开发 > SpringBoot怎么实现WebSocket即时通讯

SpringBoot怎么实现WebSocket即时通讯

1、引入依赖org.springframework.bootspring-boot-starter-websocketorg.projectlomboklombokcom.alibabafastjson1.2.32、WebSocketConfig开启WebSocketpackagecom.shucha.deveiface.web.config;/***@authortqf*@Description*@Version1.0*@since2022-04-1215:35*/importorg.springfra

本文目录

    1、引入依赖

    
    	org.springframework.boot
    	spring-boot-starter-websocket
    
    
    	org.projectlombok
    	lombok
    
    
    	com.alibaba
    	fastjson
    	1.2.3
    

    2、WebSocketConfig 开启WebSocket

    package com.shucha.deveiface.web.config;
     
    /**
     * @author tqf
     * @Description
     * @Version 1.0
     * @since 2022-04-12 15:35
     */
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
     
     
    /**
     * 开启WebSocket
     */
    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter(){
            return new ServerEndpointExporter();
        }
    }

    3、WebSocketServer

    package com.shucha.deveiface.web.ws;
     
    /**
     * @author tqf
     * @Description
     * @Version 1.0
     * @since 2022-04-12 15:33
     */
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.socket.WebSocketSession;
     
    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.CopyOnWriteArraySet;
     
    @Component
    @ServerEndpoint("/webSocket/{userId}")
    @Slf4j
    public class WebSocketServer {
        private Session session;
        private String userId;
        /**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/
        private static int onlineCount = 0;
        private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>();
     
        /**
         * concurrent包的线程安全set,用来存放每个客户端对应的MyWebSocket对象
         */
        private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap();
     
        /**
         * 为了保存在线用户信息,在方法中新建一个list存储一下【实际项目依据复杂度,可以存储到数据库或者缓存】
         */
        private final static List SESSIONS = Collections.synchronizedList(new ArrayList<>());
     
        /**
         * 建立连接
         * @param session
         * @param userId
         */
        @OnOpen
        public void onOpen(Session session, @PathParam("userId") String userId) {
            this.session = session;
            this.userId = userId;
            webSocketSet.add(this);
            SESSIONS.add(session);
            if (webSocketMap.containsKey(userId)) {
                webSocketMap.remove(userId);
                webSocketMap.put(userId,this);
            } else {
                webSocketMap.put(userId,this);
                addOnlineCount();
            }
            // log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size());
            log.info("[连接ID:{}] 建立连接, 当前连接数:{}", this.userId, webSocketMap.size());
        }
     
        /**
         * 断开连接
         */
        @OnClose
        public void onClose() {
            webSocketSet.remove(this);
            if (webSocketMap.containsKey(userId)) {
                webSocketMap.remove(userId);
                subOnlineCount();
            }
            // log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size());
            log.info("[连接ID:{}] 断开连接, 当前连接数:{}", userId, webSocketMap.size());
        }
     
        /**
         * 发送错误
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            log.info("[连接ID:{}] 错误原因:{}", this.userId, error.getMessage());
            error.printStackTrace();
        }
     
        /**
         * 收到消息
         * @param message
         */
        @OnMessage
        public void onMessage(String message) {
            // log.info("【websocket消息】收到客户端发来的消息:{}", message);
            log.info("[连接ID:{}] 收到消息:{}", this.userId, message);
        }
     
        /**
         * 发送消息
         * @param message
         * @param userId
         */
        public void sendMessage(String message,Long userId) {
            WebSocketServer webSocketServer = webSocketMap.get(String.valueOf(userId));
            if (webSocketServer!=null){
                log.info("【websocket消息】推送消息, message={}", message);
                try {
                    webSocketServer.session.getBasicRemote().sendText(message);
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("[连接ID:{}] 发送消息失败, 消息:{}", this.userId, message, e);
                }
            }
        }
     
        /**
         * 群发消息
         * @param message
         */
        public void sendMassMessage(String message) {
            try {
                for (Session session : SESSIONS) {
                    if (session.isOpen()) {
                        session.getBasicRemote().sendText(message);
                        log.info("[连接ID:{}] 发送消息:{}",session.getRequestParameterMap().get("userId"),message);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        /**
         * 获取当前连接数
         * @return
         */
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
     
        /**
         * 当前连接数加一
         */
        public static synchronized void addOnlineCount() {
            WebSocketServer.onlineCount++;
        }
     
        /**
         * 当前连接数减一
         */
        public static synchronized void subOnlineCount() {
            WebSocketServer.onlineCount--;
        }
     
    }

    4、测试连接发送和接收消息

    package com.shucha.deveiface.web.controller;
     
    import com.alibaba.fastjson.JSONObject;
    import com.shucha.deveiface.web.ws.WebSocketServer;
    import lombok.Data;
    import lombok.experimental.Accessors;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    /**
     * @author tqf
     * @Description
     * @Version 1.0
     * @since 2022-04-12 15:44
     */
    @RestController
    @RequestMapping("/web")
    public class TestWebSocket {
        @Autowired
        private WebSocketServer webSocketServer;
     
        /**
         * 消息发送测试
         */
        @GetMapping("/test")
        public void test(){
            for (int i=1;i<4;i++) {
                WebsocketResponse response = new WebsocketResponse();
                response.setUserId(String.valueOf(i));
                response.setUserName("姓名"+ i);
                response.setAge(i);
                webSocketServer.sendMessage(JSONObject.toJSONString(response), Long.valueOf(String.valueOf(i)));
            }
        }
     
        /**
         * 群发消息测试(给当前连接用户发送)
         */
        @GetMapping("/sendMassMessage")
        public void sendMassMessage(){
            WebsocketResponse response = new WebsocketResponse();
            response.setUserName("群发消息模板测试");
            webSocketServer.sendMassMessage(JSONObject.toJSONString(response));
        }
     
        @Data
        @Accessors(chain = true)
        public static class WebsocketResponse {
            private String userId;
            private String userName;
            private int age;
        }
    }

    5、在线测试地址

    websocket 在线测试

    6、测试截图

    访问测试发送消息:http://localhost:50041//web/test

    测试访问地址:ws://192.168.0.115:50041/webSocket/1   wss://192.168.0.115:50041/webSocket/2

    SpringBoot怎么实现WebSocket即时通讯

    SpringBoot怎么实现WebSocket即时通讯

    SpringBoot怎么实现WebSocket即时通讯

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Spring Boot WebSocket 实现多客户端实时同步的完整教程
    Spring Boot WebSocket 实现多客户端实时同步的完整教程

    基于Spring Boot WebSocket实现多客户端实时数据同步的完整指南 在分布式或协作式应用中,实现多客户端数据的自动同步是个经典需求。今天,我们就来深入探讨一下,如何利用Spring Boot的WebSocket和STOMP协议,构建一个高效的实时同步系统。核心思路其实很清晰:构建一个发

    前往Golang学习之Websocket实现技巧
    前往Golang学习之Websocket实现技巧

    Golang作为一个功能强大的编程语言,一直以来都受到了广泛的关注和使用。在Web开发中,Golang也有着很好的表现,特别是在实现Websocket时,相比其他编程语言,Golang的优势更加明显。本篇文章将会介绍如何使用Golang实现Websocket,并分享一些实现技巧。一、什么是Websocket?Websocket是一种基于TCP协议的全双工通信

    PHP API开发中的如何处理Long Polling和WebSocket
    PHP API开发中的如何处理Long Polling和WebSocket

    随着互联网和移动互联网的发展,越来越多的应用程序需要实现实时通信功能。在Web开发中,LongPolling和WebSocket是两个常用的协议,可以实现实时通信的功能。在PHPAPI开发中,如何处理LongPolling和WebSocket是一个需要考虑的问题。一、LongPollingLongPolling(长轮询)是一

    如何使用Golang实现Websocket通信
    如何使用Golang实现Websocket通信

    随着互联网的发展,Websocket成为了一种非常流行的通信协议,可以帮助我们实现实时通信等应用。在这篇文章中,我们将着重介绍如何使用Golang实现Websocket通信。Golang在处理并发方面非常出色,因此使用它来处理Websocket通信非常方便。一、了解WebsocketWebsocket是一种协议,它允许在两个端点之间建立持久连接,以便进行双向

    使用PHP和WebSocket集成实现在线游戏开发
    使用PHP和WebSocket集成实现在线游戏开发

    随着互联网及移动设备的普及,线上游戏已经成为很多人日常娱乐的一种方式。在线游戏的开发涉及到多个技术领域,如服务器开发、数据库设计、前端开发等。本文将介绍如何使用PHP和WebSocket集成实现在线游戏开发。一、PHP简介PHP是一种开源的服务器端编程语言,主要用于Web开发。PHP可以与多种数据库进行交互,如MySQL、Oracle、PostgreSQL等

    如何使用PHP和Websocket实现实时能量监测系统
    如何使用PHP和Websocket实现实时能量监测系统

    随着人们对节能环保的日益重视,能量监测系统越来越受欢迎。利用现有技术,我们可以创建一个实时能量监测系统,使用PHP和Websocket技术来实现数据的实时传递。本文将介绍如何利用这两种技术来创建一个完整的实时能量监测系统。一、什么是WebsocketWebsocket是HTML5中一项新的协议标准,它允许浏览器和服务器之间进行实时数据传输。这种无状态的协议可

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    如何在PHP开发中使用WebSocket进行实时通信
    如何在PHP开发中使用WebSocket进行实时通信

    随着互联网的日趋发展,实时通信成为了我们不可割舍的一部分。而WebSocket作为HTTP升级协议之一,其基于TCP协议更为高效稳定。在PHP开发中,如何使用WebSocket实现实时通信呢?本文将从以下几个方面进行介绍。WebSocket简介WebSocket是一种网络协议,它基于TCP协议进行通信,通常被用于实时通信。与HT

    实现一个简单的聊天应用程序:使用PHP和WebSocket
    实现一个简单的聊天应用程序:使用PHP和WebSocket

    现在的网络应用程序越来越普及化,很多人都想拥有自己的聊天应用程序,能够帮助他们在网上与朋友、同事或家人轻松地聊天。实现一个聊天应用程序听起来很复杂,但是如果你掌握了PHP和WebSocket的基础知识,那么就可以很容易地完成这个任务。这篇文章将向你介绍如何用PHP和WebSocket构建一个简单的聊天应用程序。无需JavaScript或任何其他额外的客户端库

    学习使用PHP和WebSocket进行实时通信
    学习使用PHP和WebSocket进行实时通信

    随着互联网和移动互联网的快速发展,越来越多的网站和应用需要实时通信的功能,这就需要采用一些特殊的技术来实现。其中,PHP和WebSocket是非常常见的两种技术,下面我们将介绍如何使用它们进行实时通信。一、PHPPHP是一种非常流行的服务器端脚本语言,用于在Web服务器上处理动态页面。PHP强大的语法和简洁的代码结构,使得它成为开发Web应用的首选语言之一。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。