SpringBoot3-整合WebSocket指南
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍
SpringBoot3-整合WebSocket指南
- 1. 什么是WebSocket?
- 2. 环境准备
- 2.1 项目依赖
- 3. WebSocket配置
- 3.1 WebSocket配置类
- 3.2 自定义WebSocket处理器
- 4. 控制器
- 5. 前端实现
- 5.1 HTML页面
- 6. 测试WebSocket功能
- 7. 进阶功能
- 7.1 心跳检测
- 7.2 消息重试机制
- 8. 注意事项
- 9. 总结
- 参考资料
1. 什么是WebSocket?
WebSocket 是一种网络通信协议,提供全双工通信通道,使服务器可以主动向客户端推送数据。与传统的 HTTP 请求-响应模式不同,WebSocket 在建立连接后,允许服务器和客户端之间进行双向实时通信。
主要特点:
- 建立在 TCP 协议之上
- 与 HTTP 协议有良好的兼容性
- 数据格式轻量,性能开销小
- 可以发送文本和二进制数据
- 没有同源限制,客户端可以与任意服务器通信
2. 环境准备
2.1 项目依赖
首先在pom.xml
中添加必要的依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version>
</parent><dependencies><!-- WebSocket依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Lombok依赖(可选) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>
3. WebSocket配置
3.1 WebSocket配置类
创建 WebSocket 配置类,启用 WebSocket 功能并注册端点:
package com.coderjia.boot3websocket.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;/*** @author CoderJia* @create 2024/12/15 下午 08:11* @Description**/
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(webSocketHandler(), "/websocket").setAllowedOrigins("*"); // 允许跨域访问}@Beanpublic WebSocketHandler webSocketHandler() {// 使用自定义的WebSocket处理器return new CustomWebSocketHandler();}
}
3.2 自定义WebSocket处理器
创建自定义的 WebSocket 处理器,处理消息收发:
package com.coderjia.boot3websocket.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author CoderJia* @create 2024/12/15 下午 08:21* @Description**/
@Component
@Slf4j
public class CustomWebSocketHandler extends TextWebSocketHandler {// 用于存储WebSocket会话private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String sessionId = session.getId();sessions.put(sessionId, session);log.info("WebSocket连接建立成功:{}", sessionId);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();log.info("收到消息:{}", payload);// 发送回复消息String replyMessage = "服务器收到消息:" + payload;session.sendMessage(new TextMessage(replyMessage));}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {String sessionId = session.getId();sessions.remove(sessionId);log.info("WebSocket连接关闭:{}", sessionId);}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {log.error("WebSocket传输错误", exception);}// 广播消息给所有连接的客户端public void broadcastMessage(String message) {sessions.values().forEach(session -> {try {session.sendMessage(new TextMessage(message));} catch (IOException e) {log.error("广播消息失败", e);}});}
}
4. 控制器
创建 REST 控制器,用于测试消息广播:
@RestController
@RequestMapping("/api/websocket")
public class WebSocketController {private final CustomWebSocketHandler webSocketHandler;public WebSocketController(CustomWebSocketHandler webSocketHandler) {this.webSocketHandler = webSocketHandler;}@PostMapping("/broadcast")public ResponseEntity<String> broadcastMessage(@RequestBody String message) {webSocketHandler.broadcastMessage(message);return ResponseEntity.ok("消息广播成功");}
}
5. 前端实现
5.1 HTML页面
<!DOCTYPE html>
<html lang="en">
<head><title>WebSocket测试</title>
</head>
<body><div><h2>WebSocket测试页面</h2><div><input type="text" id="messageInput" placeholder="输入消息"><button onclick="sendMessage()">发送</button></div><div id="messages" style="margin-top: 20px;"></div></div><script>let ws = null;function connect() {ws = new WebSocket('ws://localhost:8080/websocket');ws.onopen = function() {console.log('WebSocket连接已建立');appendMessage('系统消息:连接已建立');};ws.onmessage = function(event) {appendMessage('收到消息:' + event.data);};ws.onclose = function() {console.log('WebSocket连接已关闭');appendMessage('系统消息:连接已关闭');};ws.onerror = function(error) {console.error('WebSocket错误:', error);appendMessage('系统消息:连接发生错误');};}function sendMessage() {const messageInput = document.getElementById('messageInput');const message = messageInput.value;if (ws && message) {ws.send(message);appendMessage('发送消息:' + message);messageInput.value = '';}}function appendMessage(message) {const messagesDiv = document.getElementById('messages');const messageElement = document.createElement('div');messageElement.textContent = message;messagesDiv.appendChild(messageElement);}// 页面加载完成后连接WebSocketwindow.onload = connect;</script>
</body>
</html>
6. 测试WebSocket功能
- 启动 SpringBoot 应用
- 打开多个浏览器窗口访问 HTML 页面
- 在任意窗口发送消息,观察其他窗口是否收到消息
- 使用 POST 请求测试广播功能:
curl -X POST http://localhost:8080/api/websocket/broadcast \-H "Content-Type: text/plain" \-d "这是一条广播消息"
7. 进阶功能
7.1 心跳检测
为了保持WebSocket连接的稳定性,可以实现心跳机制:
@Scheduled(fixedRate = 10000) // 每10秒发送一次心跳,需要启动类或配置类上添加@EnableSchedulingpublic void sendHeartbeat() {String heartbeat = "heartbeat";sessions.values().forEach(session -> {try {session.sendMessage(new TextMessage(heartbeat));} catch (IOException e) {log.error("发送心跳消息失败", e);}});}
7.2 消息重试机制
当消息发送失败时,实现重试机制:
public void sendMessageWithRetry(WebSocketSession session, String message, int maxRetries) {int retryCount = 0;while (retryCount < maxRetries) {try {session.sendMessage(new TextMessage(message));return;} catch (IOException e) {retryCount++;log.error("消息发送失败,尝试重试 {}/{}", retryCount, maxRetries);try {Thread.sleep(1000);} catch (InterruptedException ie) {Thread.currentThread().interrupt();break;}}}log.error("消息发送失败,达到最大重试次数");
}
8. 注意事项
-
连接管理
- 及时清理断开的连接
- 实现最大连接数限制
- 考虑使用连接池管理WebSocket连接
-
安全性
- 实现用户认证
- 添加消息加密
- 设置适当的跨域策略
-
性能优化
- 使用消息队列处理大量消息
- 实现消息压缩
- 控制消息大小
-
错误处理
- 完善异常处理机制
- 实现日志记录
- 添加监控告警
9. 总结
SpringBoot 3 整合 WebSocket 提供了一种高效的实时通信解决方案。通过本文的配置和示例,你可以快速实现:
- WebSocket服务器端配置
- 客户端连接管理
- 消息收发处理
- 广播功能
- 心跳检测
- 错误处理
这些功能可以作为构建实时应用的基础,如在线聊天、实时数据推送、游戏等场景。根据具体需求,你可以在此基础上扩展更多功能。
参考资料
- Spring WebSocket文档
- WebSocket协议规范
- Spring Boot文档
相关文章:
SpringBoot3-整合WebSocket指南
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ SpringBoot3-整合WebSocket指南 1. 什么是WebSocket?2. 环境准备2.1 项目依赖 3. WebSocket配置3.1 WebSocket配置类3.2 自定义WebSocket处理器 4. 控制器5. 前端实现5.…...
【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合
文章目录 背景如何使用附上rimraf的介绍和说明主要作用使用场景安装使用示例异步删除同步删除 参考资料 背景 在npm run build时,一般都会清空项目中已有的dist目录再构建,避免新旧混合。 如何使用 可以简单使用rimraf这个npm依赖包。 目前rimraf的最…...
python学opencv|读取图像(二十四)使用cv2.putText()绘制文字进阶-倾斜文字
【1】引言 前述学习进程中,我们已经掌握了pythonopencv绘制文字的基本技能,相关链接为: python学opencv|读取图像(二十三)使用cv2.putText()绘制文字-CSDN博客 在这里,我们使用不同的字体、线条颜色和线…...
【简博士统计学习方法】第1章:3. 统计学习方法的三要素
3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…...
“AI智慧语言训练系统:让语言学习变得更简单有趣
大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧࿰…...
机器学习笔记 - 单幅图像深度估计的最新技术
1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…...
洛谷:P1540 [NOIP2010 提高组] 机器翻译
[NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于…...
2025第2周 | JavaScript中的函数的参数默认值和剩余参数
目录 1. 函数的默认值1.1 ES5的时候默认值写法1.2 es6的默认值1.3 babel转换之后1.4 有默认值的参数建议放到最后1.5 有默认值的函数length属性 2. 参数为对象时默认值及解构2.1 默认值和解构一起使用2.2 默认值为一个空对象 3. 剩余参数3.1 剩余参数必须放到最后3.2 剩余参数和…...
Unity学习之UGUI(三)
十二、Slider 1、作用 Slider是滑动条组件,是UGUI中用于处理滑动条相关交互的关键组件 创建Slider默认包括4个对象 父对象:Slider组件依附的对象 子对象:背景图,进度图,滑动块三组对象 2、主要参数 3、代码控制 voi…...
分享3个国内使用正版GPT的网站【亲测有效!2025最新】
1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao...
ffmpeg-avio实战:打开本地文件或者网络直播流dome
使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…...
三维管线管网自动化建模工具MagicPipe3D V3.6.0
经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎…...
设计基于检索增强生成的个性化语言模型(RAG-based LLM)
设计基于检索增强生成的个性化语言模型(RAG-based LLM) 引言 在当今快速发展的自然语言处理技术中,生成式预训练模型(LLM)对个性化和可靠结果的需求不断增加。为了满足这种需求,基于检索增强生成…...
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库 目录 Oracle Dataguard(主库为单节点)配置详解(5)&am…...
119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…...
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机(ELM) 极限学习机是一种单层前馈神经网络,具有训练速…...
服务器漏洞修复解决方案
漏洞1、远程桌面授权服务启用检测【原理扫描】 Windows Remote Desktop Licensing Service is running: Get Server version: 0x60000604 1、解决方案:建议禁用相关服务避免目标被利用 方法一:使用服务管理器 打开“运行”对话框(WinR&am…...
Couldn‘t resolve host name for http://mirrorlist.centos.org
【问题】 在CentOS8执行sudo yum update -y 软件包更新的时候报错 Errors during downloading metadata for repository appstream:- Curl error (6): Couldnt resolve host name for http://mirrorlist.centos.org/?release8-stream&archx86_64&repoAppStream&…...
Vue2:el-table中的文字根据内容改变颜色
想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …...
C++静态变量的使用方法?C++静态变量占用内存情况?拷贝构造函数会拷贝哪些内容?const使用注意
1.静态变量的使用 函数中使用:静态变量初次声明并定义作为初始值,后续再次运行函数,基于上次的结果累加类中:类内声明,类外实现(如声明为const,特殊情况,可以类内直接声明时定义&am…...
Linux初识——基本指令
我们在linux下输入各种指令,其实就相当于在windows中的相关操作,比如双击,新建文件夹等。 以下是相关基本指令基本用法 一.ls(显示当前目录下的所有文件和目录) 那如何显示当前目录(我们所在的位置&…...
python 实现贪心算法(Greedy Algorithm)
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优的选择,希望通过局部最优解达到全局最优解的算法设计方法。以下是使用Python实现贪心算法解决几个经典问题的示例: 1. 活动选择问题(Activity Selection…...
设计形成从业务特点到设计模式的关联
规范和指引在应用架构、数据架构等各架构方向上形成规范性约束指导。同一个决策要点、架构单元在统一的架构原则指导下,会因业务特点差异有不同的实现,经过总结形成了最佳实践。在开展新应用的设计时,根据决策要点以及相关的业务特点…...
Pytorch初学
创建虚拟环境 python控制台,jupyter notebook,python文件运行的差异,后续结合使用三者。 jupter主要可以对代码进行分割单独运行,主要做一些探索性工作。 数据集的常见存储模式 1、以标签命名图像。 2、单独存储图像的地址。 加载数据集…...
【动态重建】时间高斯分层的长体积视频
标题:Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源:浙江大学 链接:https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…...
Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
文章目录 模式介绍优缺点适用场景结构案例实现注意事项 模式介绍 有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此…...
IOS开发如何从入门进阶到高级
针对iOS开发的学习,不同阶段应采取不同的学习方式,以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段,下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作,汇集了大量开…...
数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)
将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums ,其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入:nums [-10,-3,0,5,9…...
细说STM32F407单片机以轮询方式读写外部SRAM的方法
目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC (1) 模式设置 (2) Bank 1子区3参数设置 1) NOR/PSRAM control组,子区控制参数 2) NOR/PSRAM timi…...
【Unity3D】AB包加密(AssetBundle加密)
加密前: 加密后,直接无法加载ab,所以无法正常看到ab内容。 using UnityEngine; using UnityEditor; using System.IO; public static class AssetBundleDemoTest {[MenuItem("Tools/打包!")]public static void Build(){//注意:St…...
wujie无界微前端框架初使用
先说一下项目需求:将单独的四套系统的登录操作统一放在一个入口页面进行登录,所有系统都使用的是vue3,(不要问我为啥会这样设计,产品说的客户要求) 1.主系统下载wujie 我全套都是vue3,所以直接…...
联发科MTK6771/MT6771安卓核心板规格参数介绍
MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...
ZooKeeper Java API操作
(1)添加依赖,在pom.xml文件中添加zookeeper依赖: (2)连接zookeeper服务,创建cn.itcast.zookeeper包,在该包中创建ZooKeeperDemo类,该类用于实现创建会话和操作ZooKeeper&…...
【vue3封装element-plus的反馈组件el-drawer、el-dialog】
vue2中封装el-drawer、el-dialog这类反馈类子组件,需要将父组件的visible值传递子组件,并且再通过$emit将关闭弹窗的组件值传回父组件,同事子组件还需要监听父组件传递过来的visible的值,来驱动弹窗显示隐藏,很麻烦&am…...
doris:远程存储
功能简介 远程存储支持把部分数据放到外部存储(例如对象存储,HDFS)上,节省成本,不牺牲功能。 注意 远程存储的数据只有一个副本,数据可靠性依赖远程存储的数据可靠性,您需要保证远程存储有…...
win11 电脑重启后,需要重新插拔U盘、移动硬盘才能识别问题
win11 电脑重启后,需要重新插拔U盘、移动硬盘才能识别问题 前言 原因:win10在一个版本更新后,usb默认都开了自动停用 一、解决方式一 在设备管理里面找到那些需要插拔才能识别的usb设备,电源策略里关掉“允许计算机关闭这个设…...
望获实时Linux系统与大语言模型深度融合,开创实时智能无限可能!
大语言模型的崛起为智能化应用开辟了新的可能性。借助深度学习技术,这些模型能够理解和生成自然语言,处理复杂的文本和语义信息。这使得它们在诸如人机问答、内容生成和数据分析等领域展现出巨大的潜力。在实时控制领域,大语言模型能够显著提…...
【工业场景】用YOLOv8实现工业安全帽识别
工业安全帽识别是一项重要的工作安全管理措施,旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型,可以实时准确地检测出工人是否佩戴安全帽,及时发现违规行为,为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…...
137. 只出现一次的数字 II
137. 只出现一次的数字 II 题目-中等难度1. 位运算2. 位运算 题目-中等难度 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数…...
Transformer 和 Attention机制入门
1. 什么是 Transformer 背景: 在自然语言处理领域,早期常使用循环神经网络(RNN)及其变体(如 LSTM、GRU)来处理序列数据,如机器翻译、文本生成等任务。然而,RNN 结构存在以下问题&…...
selenium合集
环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器:chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️:下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像࿱…...
# Java 发送电子邮件示例
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
数据结构-单链表
文章目录 一、单链表的概念及结构1.链表的概念2.链表的节点结构3.单链表增删查改操作的实现 一、单链表的概念及结构 1.链表的概念 🍉🍉概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中…...
软件工程期末整理(二)
快速原型开发模型是(适用于客户需求难以清楚定义、规模较小的系统)。(编写系统实施计划)不是系统设计阶段的主要活动 解释:系统实施计划”更侧重于后续的实施与部署阶段,属于项目管理层面的内容 协作性不属于构件的特性在类图中…...
【Python】基于blind-watermark库添加图片盲水印
blind-watermark 是一个用于在图像中添加和提取盲水印的 Python 库。盲水印是一种嵌入信息(如水印)到图像中的方法,使得水印在视觉上不可见,但在需要时可以通过特定的算法进行提取。以下是如何使用 blind-watermark 库来添加和提取…...
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
Django:构建高效Web应用的强大框架
在当今快速发展的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Django,作为Python编程语言中最受欢迎的Web框架之一,凭借其强大的功能、高度的可扩展性和简洁的语法,成为了众多开发者心中的首选。本文将深入探讨Django…...
前端-计算机网络篇
一.网络分类 1.按照网络的作用范围进行分类 (1)广域网WAN(Wide Area Network) 广域网的作用范围通常为几十到几千公里,因而有时也称为远程网(long haul network)。广域网是互联网的核心部分,其任务是长距离运送主机…...
Mybatis-plus
一、简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上只做增强而不做改变,目的是简化开发、提高效率。MyBatis-Plus提供了许多便捷的功能,如强大的CRUD操作、支持多种主键策略、内置代码生成器…...
跨年烟花C++代码
嘿,朋友们!今天来给大家讲讲一段挺有意思的C代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...