springBoot快速搭建WebSocket
- 添加依赖
在pom.xml中加入WebSocket相关依赖:
<dependencies><!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- websocket -->
</dependencies>
- 创建SocketHandler(我们socket的消息类型有两种:TextMessage 类型用于处理文本帧, BinaryMessage 类型用于处理二进制帧)
创建MyWebSocketHandler处理文本帧
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;@Component
public class MyWebSocketHandler extends TextWebSocketHandler {@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();//接收到的消息System.out.println("Received: " + payload);session.sendMessage(new TextMessage(payload));}
}
创建MyBinaryWebSocketHandler处理二进制帧
import org.springframework.stereotype.Component;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.BinaryWebSocketHandler;import java.nio.ByteBuffer;@Component
public class MyBinaryWebSocketHandler extends BinaryWebSocketHandler {@Overridepublic void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {// 从BinaryMessage中获取二进制数据ByteBuffer byteBuffer = message.getPayload();// 这里可以处理接收到的二进制数据while (byteBuffer.hasRemaining()) {byte b = byteBuffer.get();// 处理每一个字节System.out.println("Received byte: " + b);}//发送二进制响应//session.sendMessage(new BinaryMessage(byteBuffer));//或发送文本响应session.sendMessage(new TextMessage("111111"));}
}
- 创建WebSocketConfig
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {private final MyWebSocketHandler myWebSocketHandler;private final MyBinaryWebSocketHandler myBinaryWebSocketHandler;public WebSocketConfig(MyWebSocketHandler myWebSocketHandler, MyBinaryWebSocketHandler myBinaryWebSocketHandler) {this.myWebSocketHandler = myWebSocketHandler;this.myBinaryWebSocketHandler = myBinaryWebSocketHandler;}@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(myWebSocketHandler, "/TextMessage").setAllowedOrigins("*");//接收/TextMessage结尾的文本消息registry.addHandler(myBinaryWebSocketHandler, "/BinaryMessage").setAllowedOrigins("*");//接收/BinaryMessage结尾的二进制帧消息}
}
- 创建前端页面index.html 文件,包含一个简单的 WebSocket 客户端
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket Demo</title>
</head>
<body><h1>WebSocket Demo</h1><button onclick="connect()">Connect</button><button onclick="disconnect()">Disconnect</button><br><input type="text" id="message" placeholder="Enter message"><button onclick="sendMessage()">Send</button><ul id="messages"></ul><script>var webSocket;function connect() {webSocket = new WebSocket('ws://localhost:8080/TextMessage');webSocket.onmessage = function(event) {var messages = document.getElementById('messages');var message = document.createElement('li');message.textContent = event.data;messages.appendChild(message);};webSocket.onopen = function(event) {console.log('Connected to WebSocket');};webSocket.onclose = function(event) {console.log('Disconnected from WebSocket');};}function disconnect() {if (webSocket) {webSocket.close();}}function sendMessage() {var messageInput = document.getElementById('message');var message = messageInput.value;webSocket.send(message);messageInput.value = '';}</script>
</body>
</html>
- 运行应用程序
运行 Spring Boot 应用程序,然后浏览器打开 index.html。你应该会看到一个简单的 WebSocket 客户端界面。
点击 “Connect” 按钮连接到 WebSocket 服务器,输入消息并点击 “Send” 按钮发送消息。你应该会在页面上看到服务器返回的 “Echo” 消息。
相关文章:
springBoot快速搭建WebSocket
添加依赖 在pom.xml中加入WebSocket相关依赖: <dependencies><!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>…...
掌控授权的艺术:Laravel自定义策略模式深度解析
掌控授权的艺术:Laravel自定义策略模式深度解析 在现代Web应用开发中,权限管理是核心功能之一。Laravel框架通过其策略模式提供了一种优雅的方式来处理授权问题。然而,随着应用的复杂性增加,内置的策略可能不足以满足所有需求。这…...
Git操作指令(随时更新)
Git操作指令 一、安装git 1、设置配置信息: # global全局配置 git config --global user.name "Your username" git config --global user.email "Your email"# 显示颜色 git config --global color.ui true# 配置别名,各种指令都…...
SpringSecurity自定义登录方式
自定义登录: 定义Token定义Filter定义Provider配置类中定义登录的接口 自定义AuthenticationToken public class EmailAuthenticationToken extends UsernamePasswordAuthenticationToken{public EmailAuthenticationToken(Object principal, Object credentials) …...
黑神话悟空是什么游戏 黑神话悟空配置要求 黑神话悟空好玩吗值得买吗 黑神话悟空苹果电脑可以玩吗
《黑神话:悟空》的类型定义是一款单机动作角色扮演游戏,但实际体验后会发现,游戏在很多设计上采用了「魂like」作品的常见元素。根据个人上手试玩,《黑神话:悟空》的推进节奏比较接近魂类游戏,Boss战也更像…...
深入浅出消息队列----【延迟消息的实现原理】
深入浅出消息队列----【延迟消息的实现原理】 粗说 RocketMQ 的设计细说 RocketMQ 的设计这样实现是否有什么问题? 本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法 文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】 粗…...
npm提示 certificate has expired 证书已过期 已解决
在用npm新建项目时,突然发现报错提示 : certificate has expired 证书已过期 了解一下,在网络通信中,HTTPS 是一种通过 SSL/TLS 加密的安全 HTTP 通信协议。证书在 HTTPS 中扮演着至关重要的角色,用于验证服务器身份并加密数据传输…...
KEIL如何封装文件成lib
一、为什么要封装文件成LIB 提高编译效率 如果一份文件已经在整个工程中发挥出了我们期待的作用,现在想要将其封装成库,则可以在已经成型的工程文件中将不需要编译的文件从工程全部移出掉,只留下我们需要封装的文件,这样就可以提…...
【python】OpenCV—Faster Video File FPS
文章目录 1、需求描述2、正常方法 cv2.read3、加速方法 imutils.video.FileVideoStream4、涉及到的核心库函数4.1、imutils.video.FPS4.2、imutils.video.FileVideoStream 5、参考 1、需求描述 使用线程和队列数据结构将视频文件的 FPS 速率提高 ! 我们的目标是将…...
JavaScript变量的类型转换
类型转换分为两种:显示类型转换、隐式类型转换 1.显示类型转换 String()Number()Boolean()toString()parseInt(string)parseFloat(string)2.隐式类型转换 (1)isNaN () 判断指定的参数是否为 NaN(非数字类型),返回结果为 Boolean 类型。也就是说:任何不能被转换为数值的…...
如何申请免费SSL证书以消除访问网站显示连接不安全提醒
在当今互联网时代,网络安全已成为一个不可忽视的问题。当用户浏览一些网站时,有时会看到浏览器地址栏出现“不安全”的提示,这意味着该网站没有安装SSL证书,数据传输可能存在风险。那么,如何消除这种不安全提醒&#x…...
关于P2P(点对点)
P2P 是一种客户端与客户端之间,点对点连接的技术,在早前的客户端都是公网IP,没有NAT的情况下,P2P是较为容易实现的。 但现在的P2P,实现上面会略微有一些复杂:需要采取UDP打洞的技术,但UDP打出来…...
前端怎么本地起一个服务查看本地文件
1.安装拓展 安装 Live Server拓展 2.创建一个html文件 3.在html文件中右键选择 Open with Live Server 4.浏览器打开运行的地址,并去除路径,例如:http://127.0.0.1:5500/...
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,它主要用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种设计模式的核心思想是将一个复杂对象的构建分解成多个相对简单的步骤,并…...
【MySQL】索引 【下】{聚簇索引VS非聚簇索引/创建主键索引/全文索引的创建/索引创建原则}
文章目录 1.聚簇索引 VS 非聚簇索引经典问题 2.索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引索引创建原则 1.聚簇索引 VS 非聚簇索引 之前介绍的将所有的数据都放在叶子节点的这种存储引擎对应的就是 InnoDB 默认存储表数据的存储结构。 …...
论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps
项目地址:https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间:2022年 相关训练数据:BlendedMVS LoFTR [19]是一种有效的深度学习方法,可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…...
免费发送邮件两种接口方式:SMTP和邮件API
SMTP与邮件API在处理大批量邮件发送时,哪个更稳定? 在现代信息化的社会中,邮件已成为不可或缺的沟通工具。无论是个人还是企业,发送邮件都是日常工作的一部分。AokSend将详细介绍两种常用的免费发送邮件接口方式:SMTP…...
大模型日报 2024-07-30
大模型日报 2024-07-30 大模型资讯 开源AI性能逼近专有领袖,最新基准测试揭示 摘要: Galileo最新的幻觉指数显示,开源AI模型的性能正在迅速逼近专有巨头。这一发现表明,开源AI在技术进步和性能提升方面取得了显著进展,缩小了与专有…...
docker 构建 mongodb
最近需要在虚拟机上构建搭建mongo的docker容器,搞了半天老有错,归其原因,是因为现在最新的mango镜像的启动方式发生了变化,故此现在好多帖子,就是错的。 ok,话不多说: # 拉取最新镜像…...
LeetCode每日练习 | 二分查找 | 数组 |Java | 图解算法
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌 你真的刷明白了二分查找吗⁉️记得看毛毛张每个题目中写的【注意细节】⚠️ 文章目录 0.前言🍁1.[704. 二分查找🍍](https://l…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
