当前位置:

首页 > 编程开发 > SpringBoot怎么整合WebSocket实现后端向前端发送消息

SpringBoot怎么整合WebSocket实现后端向前端发送消息

一、什么是websocket接口使用websocket建立长连接,服务端和客户端可以互相通信,服务端只要有数据更新,就可以主动推给客户端。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。在WebSocketAPI中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。二、适用场

本文目录

    一、什么是 websocket 接口

    使用 websocket 建立长连接,服务端和客户端可以互相通信,服务端只要有数据更新,就可以主动推给客户端。

    WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
    在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    二、适用场景

    在业务开发过程中碰到一些异步处理(微信支付、支付宝支付的支付通知),跨应用的消息传递。

    当业务执行完毕后,需要将成功的信息投递给前端。一般情况下都是前端调用后端的http/https接口获取数据,后端想要主动推送消息给前端就需要使用到WebSocket进行前后端的通信。

    三、示例代码

    3.1、添加pom.xml依赖

    
    
        org.springframework.boot
        spring-boot-starter-websocket
    

    3.2、创建WebSokcet配置类

    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter(){
            return new ServerEndpointExporter();
        }
    }
    3.3、创建WebSokcet工具类
     
    @ServerEndpoint(value = "/websocket")
    @Component
    public class WebSocketServer {
        private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
     
        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
        private static int onlineCount = 0;
        //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
        private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();
     
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
     
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
            this.session = session;
            //加入set中
            webSocketSet.add(this);
            //在线数加1
            addOnlineCount();
            log.info("有新连接加入!当前在线人数为" + getOnlineCount());
            try {
                MsgResponseVo userMsgResponseVo = new MsgResponseVo();
                userMsgResponseVo.setMsg("SUCCESS");
                WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo));
            } catch (IOException e) {
                log.error("websocket IO异常");
            }
        }
     
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            //从set中删除
            webSocketSet.remove(this);
            //在线数减1
            subOnlineCount();
            log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
        }
     
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("来自客户端的消息:" + message);
     
            //群发消息
            for (WebSocketServer item : webSocketSet) {
                try {
                    item.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
     
        /**
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("发生错误");
            error.printStackTrace();
        }
     
        public void sendMessage(String message) throws IOException {
            this.session.getBasicRemote().sendText(message);
        }
     
        /**
         * 群发自定义消息
         */
        public static void sendInfo(String message) throws IOException {
            log.info(message);
            for (WebSocketServer item : webSocketSet) {
                try {
                    item.sendMessage(message);
                } catch (IOException e) {
                    continue;
                }
            }
        }
     
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
     
        public static synchronized void addOnlineCount() {
            WebSocketServer.onlineCount++;
        }
     
        public static synchronized void subOnlineCount() {
            WebSocketServer.onlineCount--;
        }
    }

    3.3、创建测试发送消息接口

     @GetMapping("/testWebSocket")
        public ApiRestResponse testWebSocket() throws IOException {
            //消息体
            MsgResponseVo technicianMsgResponseVo = new MsgResponseVo();
            technicianMsgResponseVo.setRole("Technician");
            technicianMsgResponseVo.setRoleId(1);
            technicianMsgResponseVo.setMsg("您的订单已取消");
            technicianMsgResponseVo.setMsgStatus("CANCEL_ORDER");
            technicianMsgResponseVo.setOrderNo("test");
            //发送消息
            WebSocketServer.sendInfo(JSON.toJSONString(technicianMsgResponseVo));
            return ApiRestResponse.success();
        }
    }

    3.4、测试webSocket

    在网站中输入ws://ip:端口/webSocket工具类的前缀(ws://127.0.0.1:8080/websocket)

    SpringBoot怎么整合WebSocket实现后端向前端发送消息

    3.5、前端使用WebSocket监听后端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 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。