websocket实现页面数据实时加载(Springboot+vue)

2023-05-16

在这里先提供两种思路。要实现页面数据的实时加载有两种方式,第一种是长轮询的方式。要么是后台长轮询,检测到数据变化时,通知websocket你该更新一下数据了。要么是前台长轮询,每隔一段时间发起请求获取数据。结合前后台长轮询的方式,这里想给各位推荐第二种--手动通知。我不频繁发起请求,我只在当我后台数据发上变化时,我通知websocket你该更新一下数据了。

在这篇文章中,前台长轮询的方式是最不建议的。所以不予以介绍。在这里只介绍后台长轮询和手动通知的方式。

一、引入websocket依赖。

<dependency>

   <groupId>org.springframework</groupId>

   <artifactId>spring-websocket</artifactId>

   <version>5.0.2.RELEAS</version>

</dependency>

二、添加websocket配置

三、后台websocket

1. 后台长轮询

后台不建议采用多线程方式。因为每次,比如5秒就打开一个线程专门来查看数据库,判断有无变化数据,将会大大占用服务器资源。可使用心跳服务的方式,每隔一段时间就查询一次。

首先添加一个websock。

onOpen是新的客户端连接进来调用的方法。

onMessage是接收客户端发来信息调用的方法。

sendMessage是发送信息调用的方法。

onClose是关闭websocket调用的方法。

onError是websocket发生错误调用的方法。

以下是代码。

import org.springframework.stereotype.Component;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

import java.io.IOException;

import java.util.concurrent.CopyOnWriteArraySet;

/**

 * socket连接

 */

@Component

@ServerEndpoint(value = "/Jqcase")

public class JqWebSocket {

    private Session session = null;

    private Integer linkCount=0;

    private static CopyOnWriteArraySet<JqWebSocket> webSocketSet=new CopyOnWriteArraySet<JqWebSocket>();

    /**

     * 新的客户端连接调用的方法

     * @param session

     */

    @OnOpen

    public void onOpen(Session session) throws IOException {

        System.out.println("-------------有新的客户端连接----------");

        linkCount++;

        this.session = session;

        webSocketSet.add(this);

    }

    /**

     * 收到客户端消息后调用的方法

     * @param message

     */

    @OnMessage

    public void onMessage(String message){

        System.out.println("发生变化"+message);

        try{

            sendMessage("发生变化"+message);

        }catch (Exception e){

            e.printStackTrace();

        }

    }

    /**

     * 发送信息调用的方法

     * @param message

     * @throws IOException

     */

    public static void sendMessage(String message) throws IOException {

        for (JqWebSocket item : webSocketSet) {

            item.session.getBasicRemote().sendText(message);

        }

    }

    @OnClose

    public void onClose(){

        //thread1.stopMe();

        linkCount--;

        webSocketSet.remove(this);

    }

    @OnError

    public void onError(Session session,Throwable error){

        System.out.println("发生错误");

        error.printStackTrace();

    }

}

然后就是一个心跳微服务啦。

先要在启动类开启心跳服务支持。

最后,通知websocket。

这里实现的思路是,当查询回来的数据,第一条数据的编号发生改变,就通知websocket发生改变。在上面的websocket可能会有空指针异常,所以需要获取上下文。配置上下文方法见下:

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class FrameSpringBeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        this.applicationContext = applicationContext;

    }

    @SuppressWarnings("unchecked")

    public static <T> T getBean(String name){

        return (T) applicationContext.getBean(name);

    }

    public static <T> T getBean(Class<T> cls){

        return applicationContext.getBean(cls);

    }

}

2.后台手动通知。

当执行添加删除操作时,手动通知刷新。

四、前台websocket

注意:要对应后台的@ServerEndpoint(value = "/hesocket")

onmessage是websocket接收到信息执行的操作,在那里操作重新获取数据加载即可。

initHESocket(){

          const wsuri = "ws://68.34.21.148:9998/hczz/hesocket";

          this.websock= new WebSocket(wsuri);

          //console.log("我连接事件处置websocket了");

          this.websock.onmessage = this.heonmessage;

          this.websock.onopen = this.heonopen;

          this.websock.send = this.hesend;

          this.websock.onclose = this.heclose;

          //console.log(this.websock);

      },

      heonopen(){

        //连接建立之后执行send方法发送数据

        //let actions = {"test":"12345"};

        //this.websocketsend(JSON.stringify(actions));

      },

      heonmessage(e){

        //console.log("在这里执行处置事件刷新操作,谢谢!!")

        // console.log(e)

        this.getpendingEvents();

        this.gethandingEvents();

      },

      hesend(data){

        //数据发送

        this.websock.send(data);

      },

      heclose(){

        console.log("断开websocket");

        this.initHESocket();

      },

写得比较粗糙,有写得错误的或者有更好方法,欢迎评论、联系交流。

代码在Springboot多连接池+websocket_springbootwebsocket连接数极限,springbootwebsocket最大连接数-Java文档类资源-CSDN下载 仅作为学习交流用途,禁止用于任何商业用途。

联系QQ:694335719(请标明添加好友原因)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

websocket实现页面数据实时加载(Springboot+vue) 的相关文章

随机推荐

  • java截取视频的三种方式

    String cut 61 34 ffmpeg ss 34 43 startTime 43 34 i 34 43 videoPath 43 34 t 34 43 String valueOf seconds 43 34 c v copy c
  • 有关C语言中字符串入栈的理解

    C语言中字符串的入栈 写在前面 对于C语言中变量入栈的顺序实际上需要具体情况具体分析 xff0c 不同操作系统下的编译器可能对此有不同的解释 xff0c 即使对于同一个C的编译器而言 xff0c 参数设定的不同也会导致编译器调整局部变量的入
  • win10 安装MySQL 无管理员权限

    1 找到下载的安装文件 xff0c 按住Shift键 xff0c 同时在安装文件上点击鼠标右键 xff0c 选择复制为路径 2 打开C Windows System32 xff0c 找打cmd exe xff0c 点击右键选择以管理员方式运
  • Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected

    现象描述 xff1a 代码连接本地kafka没有问题 能监听到监听的topic xff0c 可获取通道中的所有topic 将kafka放到服务器上 xff0c 本地程序启动报异常 xff0c 可获取kafka中所有的topic xff0c
  • java 视频转换 avi 转 MP4

    添加jar 包 lt dependency gt lt groupId gt ws schild lt groupId gt lt artifactId gt jave core lt artifactId gt lt version gt
  • 前后端分离,SpringBoot。WEBSocket后台报警页面提示

    前端JS var websocket 61 null 判断当前浏览器是否支持WebSocket 主要此处要更换为自己的地址 if 39 WebSocket 39 in window websocket 61 new WebSocket 34
  • MYSQL 依据字段值分段统计

    SELECT sum mun max from select ceil distance 500 1 500 as min ceil distance 500 500 as max count mun from tablename wher
  • java8转换数组。找到最接近指定数据

    List lt String gt lsstr 61 Arrays asList arear 数组转list List lt String gt listWithoutNulls 61 lsstr stream filter Objects
  • nested exception is java.lang.IllegalStat eException:duplicate spring bean

    nested exception is java lang IllegalStat eException duplicate spring bean 多次注入bean信息 xff0c 经过长时间排查 xff0c 我是将项目进行整合 xff0
  • Artifact xxx:war exploded: Error during artifact deployment.

    Artifact xxx war exploded Error during artifact deployment 出现这个问题 xff0c 在网上查资料 xff0c 1 说是idear 配置的tomcat Artifact 添加的Var
  • zTree取消父子关联

    对于zTree父子关联关系的设置 xff0c zTree里面自带了一个chkboxType函数 取消父子关联 xff0c 只需要在初始化树的时候 xff0c 在settings里面设置 xff1a check enable true chk
  • 解决Linux系统下,出现“不在sudoers文件中,此事将被报告”的问题

    使用sudo mkdir software xff0c 提示XXX 不在 sudoers 文件中 此事将被报告 是因为当前操作用户的权限不足 xff0c 而root用户只有在权限分配及系统设置时才会使用 xff0c 而root用户的密码也不
  • 结构体数组的引用方式

    期末复习时发现答案中有p i a的用法 xff0c 遂进行了一番测试 xff0c 所获心得记载如下 引用结构体指针数组时 xff0c p i 61 61 A i 61 61 p 43 i 注意加括号 xff0c 优先级较低 具体为 xff1
  • Hadoop安装和配置

    1 安装Hadoop 注意 xff1a 安装JDK类似 xff0c 解压后配置环境变量 1 0 Hadoop下载地址 xff1a https archive apache org dist hadoop common hadoop 2 7
  • 机器学习(1)机器学习的范围

    机器学习的范围包括但是不局限与如下 xff1a 机器学习跟模式识别 xff0c 统计学习 xff0c 数据挖掘 xff0c 计算机视觉 xff0c 语音识别 xff0c 自然语言处理等领域有着很深的联系 从范围上来说 xff0c 机器学习跟
  • Tesseract-OCR-v5.0中文识别,训练自定义字库,提高图片的识别效果

    1 xff0c 下载安装Tesseract OCR 安装 xff0c 链接地址Index of tesseract 2 xff0c 安装成功 tesseract v 注意 xff1a 安装后 xff0c 要添加系统环境变量 3 xff0c
  • 4x4矩阵按键应用详解

    一 简介 4x4矩阵按键是单片机外部设备中所使用的排布类似于矩阵的按键组 显然矩阵按键的使用要比独立按键要复杂一些 xff0c 编程也要复杂一些 xff0c 但可以单片机IO资源 4x4矩阵按键即分为4组列线 xff0c 4组行线 xff0
  • Hyper-V 显卡直通

    创建虚拟机后 xff0c 打开虚拟机设置 gt 禁用检查点功能 使用WIN11镜像来部署安装Hyper V虚拟机系统 xff0c 进入桌面后关闭虚拟机 物理机以管理员运行Windows PowerShell 输入以下命令 vm 61 34
  • mwan3 负载平衡 多PPPOE账号 LTE WIFI 负载均衡

    OpenWrt上的MWAN3可以支持多根网线或者多个PPPOE账号的同时拨号使用和负载均衡 并且还可以通过Ping方式来检测中断线路并自动屏蔽中断线路 mwan3的详细介绍 https openwrt org docs guide user
  • websocket实现页面数据实时加载(Springboot+vue)

    在这里先提供两种思路 要实现页面数据的实时加载有两种方式 xff0c 第一种是长轮询的方式 要么是后台长轮询 xff0c 检测到数据变化时 xff0c 通知websocket你该更新一下数据了 要么是前台长轮询 xff0c 每隔一段时间发起