WebSocket——SpringBoot+Vue3+TS+SockJS+STOMP简单连接使用

news2024/11/21 0:36:25

WebSocket——SpringBoot+Vue3+TS+SockJS+STOMP简单连接使用

  • 本文视频以及相关资源
  • 关于WebSocket
    • 文档
    • 什么时候使用WebSocket
    • WebSocket连接头
    • 服务器返回状态码
  • 客户端
    • 使用技术
    • Github地址
    • npm安装
      • 为什么要安装sockjs的.d.ts文件
    • 常用方法
      • 1.连接
      • 2.关闭连接
      • 3.发送消息
      • 4.设置订阅
    • 构建
      • 1.创建webSocket.ts
      • 2.完整构建
      • 3.页面逻辑
  • 服务端
    • 技术
    • 文档地址
    • 构建
      • 1.引入依赖
      • 2.构建WebSocketConfig
        • 解释
      • 3.构建两个实体类
        • Greeting
        • Hello
      • 4.设置yaml
      • 5.构建web控制器
  • 结果展示

本文视频以及相关资源

视频链接
前端Vue3标准化模板
Spring官方案例

关于WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

文档

https://docs.spring.io/spring-framework/docs/5.3.24/reference/html/web.html#websocket

什么时候使用WebSocket

延迟本身不是决定因素。如果消息量相对较低(例如,监视网络故障),HTTP流或轮询可以提供有效的解决方案。

低延迟、高频率和高容量的组合,是使用WebSocket的最佳选择。

WebSocket连接头

GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

服务器返回状态码

具有WebSocket支持的服务器返回类似于以下内容的输出,而不是通常的200状态代码

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

客户端

使用技术

  1. SocketJS
  2. StompJS
  3. Vue3
  4. TypeScript
  5. Setup语法

Github地址

https://github.com/sockjs/sockjs-client
https://github.com/jmesnil/stomp-websocket

npm安装

npm install sockjs-client@1.6.1 
//安装sockjs的.d.ts文件
npm i --save-dev @types/sockjs-client
//安装stomp
npm install stompjs
npm i --save-dev @types/stompjs
npm i net -S

为什么要安装sockjs的.d.ts文件

我们使用的ts代替了js,在ts中直接引入使用js是不能被识别的,这时候就需要有一个.d.ts的声明文件,显然原始的SockJS库中并没有这个文件,所以我们需要自己去下载一个,当然你要是厉害可以自己写一个。
不然在ts中会报找不到SockJS模块的错误

常用方法

1.连接

connect(headers: { login: string, passcode: string, host?: string | undefined }, connectCallback: (frame?: Frame) => any, errorCallback?: (error: Frame | string) => any): any;
connect(headers: { }, connectCallback: (frame?: Frame) => any, errorCallback?: (error: Frame | string) => any): any;
connect(login: string, passcode: string, connectCallback: (frame?: Frame) => any, errorCallback?: (error: Frame | string) => any, host?: string): any;

2.关闭连接

disconnect(disconnectCallback: () => any, headers?: {}): any;

3.发送消息

send(destination: string, headers?: {}, body?: string): any;

4.设置订阅

subscribe(destination: string, callback?: (message: Message) => any, headers?: {}): Subscription;

构建

1.创建webSocket.ts

//引入使用SockJS
import SockJS from "sockjs-client";
import Stomp from "stompjs";

2.完整构建

//引入使用SockJS
import SockJS from "sockjs-client";
import Stomp from "stompjs";
//请求地址
const baseUrl = "http://localhost:9000/port";
//请求头
const header = {};
//stomp客户端
let stompClient: Stomp.Client;
//连接状态
let connetStatus = false;
/**
 * 初始化连接
 */
export const initSocket = () => {
  con();
  setInterval(() => {
    //根据连接状态
    if (connetStatus) {
      try {
        //发送请求
        stompClient.send(
          "/app/hello",
          header,
          JSON.stringify({ name: "wangau" })
        );
      } catch (error) {
        con();
      }
    }
  }, 10000);
};
/**
 * 连接
 */
export const con = () => {
  let socket = new SockJS(baseUrl);

  stompClient = Stomp.over(socket);

  let header = {};
  stompClient.connect(
    header,
    () => {
      console.log("===========connect success===========");
      connetStatus = true;
      //设置订阅
      stompClient.subscribe(
        "/topic/greetings",
        (res: any) => {
          console.log(res);
        },
        header
      );
    },
    (err: any) => {
      console.log("error");
      console.log(err);
    }
  );
};

/**
 * 断开
 */
export const close = () => {
  if (stompClient) {
    stompClient.disconnect(() => {
      console.log("============connect release============");
      connetStatus = false;
    });
  }
};

3.页面逻辑

<template>
  <div id="index_container">
    <!-- 使用图标库示例 -->
    <i class="iconfont icon-smile-fill "></i>
    <el-button type="primary" @click="closeCon">关闭</el-button>
  </div>
</template>

<script lang="ts" setup>
import { initSocket, close } from '@/request/webSocket/webSocket'
import { ref, reactive, onMounted } from 'vue'
const closeCon = () => {
  close()
}

onMounted(() => {
  initSocket()
})
</script>

<style lang="scss" scoped>
@use './Index.scss';
#index_container {
  height: 100vh;
  width: 100vw;
}
</style>

服务端

技术

  1. spring-boot-starter-websocket
  2. SpringBoot2.7.6
  3. STOMP

文档地址

https://docs.spring.io/spring-framework/docs/5.3.24/reference/html/web.html#websocket-stomp

构建

1.引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.构建WebSocketConfig

package com.example.stomp.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * @author Syf200208161018
 * @date 2022/12/11 11:11
 * @ClassName:WebSocketConfig
 * @Effect:WebSocketConfig is used for
 * /port是WebSocket(或SockJS)指向的端点的HTTP URL
 * 客户端需要连接以进行WebSocket握手。
 * 目标标头以/app开头的STOMP消息被路由到
 * @Controller类中的MessageMapping方法。
 * 使用内置的消息代理进行订阅和广播
 * 将目标标头以/topic或/queue开头的消息路由到代理。
 */
@EnableWebSocketMessageBroker
@Configuration
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/port").setAllowedOriginPatterns("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic","/queue");
    }
}

解释

使用@EnableWebSocketMessageBroker开启WebSocket的子协议STOMP,配置类需要实现WebSocketMessageBrokerConfigurer接口,重写其中的注册STOMP节点方法和配置信息代理者方法

在注册STOMP节点方法中我们需要:

  1. 添加监听节点addEndpoint
  2. 设置跨域setAllowedOriginPatterns
  3. 设置使用SockJSwithSockJS(你也可以选择使用原生方式)

配置信息代理者中需要:

  1. 设置目的地前缀setApplicationDestinationPrefixes
  2. 设置代理者(代理者对应订阅者)

3.构建两个实体类

Greeting

package com.example.stomp.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Syf200208161018
 * @date 2022/12/11 14:10
 * @ClassName:Greeting
 * @Effect:Greeting is used for
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Greeting  implements Serializable {
    private String content;
}

Hello

package com.example.stomp.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Syf200208161018
 * @date 2022/12/11 14:10
 * @ClassName:Hello
 * @Effect:Hello is used for
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hello implements Serializable {
    private String name;
}

4.设置yaml

server:
  port: 9000

5.构建web控制器

package com.example.stomp.controller;

import com.example.stomp.entity.Greeting;
import com.example.stomp.entity.Hello;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Syf200208161018
 * @date 2022/12/11 14:11
 * @ClassName:TestController
 * @Effect:TestController is used for
 */
@RestController
public class TestController {

//    @MessageMapping("/hello")
//    @SendTo("/topic/greetings")
//    public Greeting greeting(){
//        return new Greeting("hello!");
//    }

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(Hello hello){
        return new Greeting(hello.getName());
    }
}

结果展示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Redis布隆过滤器工作原理与实战(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

判断质数复习与分解质因数

TIPS 1. 之前我们讲到比方说要得到一个整数&#xff08;十进制形式&#xff09;的每一位数字&#xff0c;就需要把这个整数先%10得到最低位的数字&#xff0c;然后呢再把这个整数/10更新一下&#xff0c;然后呢就这么循环往复直到最终这个不断更新的整数为0跳出循环。那如果这…

深度学习-神经网络(Pytorch应用)

文章目录简介卷积层池化层激活层线性层前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 上图摘自网络 受生物神经网络的启发&#xff0c;每个神经元与其他神经元相连&#xff0c;当…

InfluxDB时序数据库-笔记-更新中

本笔记由在Bilibili学习的尚硅谷教学视频后整理得来 文章目录一、InfluxDB基础概念1.1InfluxDB是什么1.2为什么选择InfluxDB而不选择关系型数据库1.3下载安装1.4Promethus数据格式1.5时序数据中的数据模型1.6与时间标准相关的知识二、Flux语言2.1初识Flux语言2.2Flux基本语法三…

献上SpringBoot核心笔记,简直就是血赚

市面上真正适合学习的SpringBoot资料太少&#xff0c;有的书或资料虽然讲得比较深入&#xff0c;但是语言晦涩难懂&#xff0c;大多数人看完这些书基本都是从入门到放弃。学透SpringBoot难道就真的就没有一种适合大多数同学的方法吗&#xff1f; 很多SpringBoot相关的知识点与…

Java+MySQL学生选课与成绩管理系统(数据库版)

一、项目要求 学生选课与成绩管理系统(数据库版) 1、配置MySQL数据库 2、利用java+MySQL实现系统各个功能 3、功能包括: (1)系统交互界面,如下图所示 (2)学生信息的增删改查。学生属性包括学号(唯一),姓名,专业。 (3)课程信息的增删改查。课程属性包括编号…

96-114-mysql-高级篇-架构篇

96-mysql-高级篇&#xff1a; 推荐网站 mysql学习网站&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.usfca.…

JoyStick Shield连接Nokia 5110--Arduino

SpaceTrash游戏是一个简单的射击游戏&#xff0c;您可以在其中控制宇宙飞船&#xff0c;并通过移动或爆破&#xff08;使用激光&#xff09;来避免漂浮在周围的小行星的碰撞。该游戏是u8g2图形库附带的示例&#xff0c;该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器…

非零基础自学Golang 第1章 走进Go 1.4 常用软件及网站 1.5 小结

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.4 常用软件及网站1.4.1 开发工具【IDE 或编辑器】1.4.2 代码管理工具1.4.3 其他工具1.4.4 网站资源1.5 小结第1章 走进Go 1.4 常用软件及网站 1.4.1 开发工具【IDE 或编辑器】 工欲善其事必先利其器。 Go开发工…

基于java+springboot+mybatis+vue+mysql的电动车辆充电桩管理系统

项目介绍 随着我国汽车行业的不断发展&#xff0c;电动汽车已经开始逐步的领导整个汽车行业&#xff0c;越来越多的人在追求环保和经济实惠的同时开始使用电动汽车&#xff0c;电动汽车和燃油汽车最大的而不同就是 需要充电&#xff0c;同时我国的基础充电桩也开始遍及了大多数…

机器人开发--SICK激光雷达系列

机器人开发--SICK激光雷达系列1 介绍2 TiM系列2.1 TiM510参数测量方法协议请求一次数据&#xff08;应答直接携带数据&#xff09;请求持续数据&#xff08;应答收到指令&#xff0c;数据持续发送&#xff09;数据内容参考1 介绍 SICK 是国际先进的工业用传感器应用程序解决方…

016 | 乡村振兴战略下农村宅基地有偿退出现状 | 大学生创新训练项目申请书 | 极致技术工厂

&#xff08;一&#xff09;研究目的 随着国家城市化进程的加快&#xff0c;城市和农村的具体情况都发生了巨大变化&#xff0c;大量的问题随之产生&#xff0c;在农村经济中&#xff0c;宅基地的有偿退出矛盾尤为突出。在当前的时代发展背景下&#xff0c;我国农村宅基地有偿…

[附源码]Python计算机毕业设计宠物寄养平台设计Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

git cherry-pick命令用法详解

1、需求背景 想在某个稳定版本上&#xff0c;添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令&#xff0c;将这个功能相关的 commit 提取出来&#xff0c;合入稳定版本的分支上。 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是常见需求。…

VS2015+PCL1.8.1安装

VS2015+PCL1.8.1安装 一、下载PCL1.8.1二、PCL-1.8.1安装三、系统环境变量配置四、 vs2015配置PCL1.8.1一、下载PCL1.8.1 1.1 首先下载pcl1.8.1的库,地址在这:pcl1.8.1库链接。   1.2 打开网站,将页面拉到最下面,下载这个两个文件:PCL-1.8.1-AllInOne-msvc2015-win64.ex…

Windows下C语言程序和网络调试助手通信

网络调试助手之间进行UDP通信 前面一篇文章介绍了Windows下的网络调试助手&#xff0c;文章链接如下&#xff1a; Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具 下面我们简单介绍一下网络调试助手的使用。 这样两个网络调试助手之间就可以进行UDP通…

矩阵 的逆、 迹、 秩

矩阵的逆&#xff1a; 矩阵的逆有是三种方法可以求 1、系数待定法&#xff1a; 2、求伴随矩阵求逆 3、通过求增广矩阵求出逆 矩阵的迹 什么是矩阵的迹 矩阵的迹是特征值的加和&#xff0c;也即矩阵A的主对角线元素的总和。 案例 矩阵的秩 什么是矩阵的秩 设 AA 为 m\tim…

Vue 进阶一 | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Vue 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答…

20221212英语学习

今日单词&#xff1a; sweet adj.含糖的, 甜的, 香的, 芳香的 founding n.建立,成立 software n.软件 pour n.流出, 大雨, 【冶】浇注, (已熔金属的)一次浇注量 recipe n.烹饪法&#xff0c;食谱&#xff1b;方法&#xff0c;秘诀&#xff0c;诀窍 graph n.图, 图表, 曲线…

Vue2 插槽的使用【默认插槽、具名插槽、作用域插槽】

前言&#xff1a; 这篇文章我们一起来学习一下 Vue2 插槽的使用&#xff0c;文章大致分为两个模块&#xff0c;第一部分是什么是插槽&#xff0c;其作用是什么&#xff0c;第二部分为三种插槽的使用&#xff0c;分别为默认插槽&#xff0c;具名插槽&#xff0c;作用域插槽&…