通过 WebSocket 接收和播放 WSS 协议视频流
1.创建wss协议视频
1.1必备包
npm install ws @ffmpeg-installer/ffmpeg fluent-ffmpeg
说明:安装以下三个包。
1.2代码实现
说明:创建WebSocket服务器,端口为8080
import { WebSocket, WebSocketServer } from 'ws'; // 导入 WebSocket 和 WebSocketServer 模块
import ffmpeg from 'fluent-ffmpeg'; // 导入 fluent-ffmpeg 模块,用于处理视频流
import ffmpegInstaller from '@ffmpeg-installer/ffmpeg'; // 导入 ffmpeg-installer 模块,用于获取 FFmpeg 的路径
// 设置 FFmpeg 路径
ffmpeg.setFfmpegPath(ffmpegInstaller.path); // 将 FFmpeg 的路径设置为安装路径
// 创建一个 WebSocket 服务器,监听端口 8080
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => { // 当有新的客户端连接时触发console.log('新客户端连接'); // 输出连接信息// 使用 FFmpeg 转换视频为 MPEG-TS 格式const command = ffmpeg('./ElephantsDream.mp4') // 指定要转换的视频文件.format('mpegts') // 设置输出格式为 MPEG-TS.videoCodec('mpeg1video') // 设置视频编码为 MPEG-1.videoBitrate('1000k') // 设置视频比特率为 1000k.size('640x480') // 设置视频分辨率为 640x480.audioCodec('mp2') // 添加音频编码为 MP2.audioBitrate('128k') // 设置音频比特率为 128k.on('error', (err) => { // 处理 FFmpeg 错误console.error('FFmpeg 错误:', err); // 输出错误信息ws.close(); // 关闭 WebSocket 连接});// 将转换后的数据流通过 WebSocket 发送const stream = command.pipe(); // 获取转换后的数据流stream.on('data', (chunk) => { // 当有数据块时触发if (ws.readyState === WebSocket.OPEN) { // 检查 WebSocket 是否处于打开状态ws.send(chunk); // 发送数据块给客户端}});// 处理断开连接ws.on('close', () => { // 当客户端断开连接时触发console.log('客户端断开连接'); // 输出断开连接信息stream.destroy(); // 销毁数据流以释放资源});
});console.log('WebSocket 服务器启动在端口 8080'); // 输出服务器启动信息
1.3文件启动
node server.js
说明:文件启动,打印日志。
2. 接收播放wss协议视频
2.1api测试
说明:服务器不停推送二进制的数据。
2.2代码实现
说明:安装jsmpeg-players播放器库,对通过websocket接收到的二进制数据进行播放。
<template><div class="video-container"><canvas ref="videoCanvas"></canvas> <!-- 用于显示视频的画布 --><div v-if="errorInfo.show" class="status error-status"><!-- 显示错误信息 --><div>时间: {{ formatTime(errorInfo.time) }}</div><div>错误次数: {{ errorInfo.count }}</div><div>{{ errorMessage }}</div><button @click="retryConnection" class="retry-btn">重试连接</button> <!-- 重试连接按钮 --></div><div v-else-if="status" class="status">{{ status }}</div> <!-- 显示当前状态 --></div>
</template><script setup>
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'; // 导入 Vue 的组合式 API
import JSMpeg from 'jsmpeg-player'; // 导入 JSMpeg 播放器库const videoCanvas = ref(null); // 用于引用画布元素
const status = ref(''); // 用于存储当前状态信息
const errorMessage = ref('WebSocket连接错误'); // 用于存储错误信息
const errorInfo = reactive({show: false, // 是否显示错误信息time: '', // 错误发生时间count: 0 // 错误次数
});
let player = null; // JSMpeg 播放器实例
let ws = null; // WebSocket 实例
let connectionTimeout = null; // 连接超时计时器// 格式化时间
const formatTime = (timeStr) => {if (!timeStr || timeStr === '不适用') return '--'; // 如果时间不可用,返回占位符return timeStr.split('.')[0]; // 去掉毫秒部分
};// 记录错误信息
const recordError = (message = 'WebSocket连接错误') => {errorInfo.show = true; // 显示错误信息errorInfo.time = new Date().toLocaleTimeString(); // 记录当前时间errorInfo.count++; // 错误次数加一errorMessage.value = message; // 更新错误信息
};// 重试连接
const retryConnection = () => {if (connectionTimeout) {clearTimeout(connectionTimeout); // 清除连接超时计时器}if (ws) {ws.close(); // 关闭现有 WebSocket 连接}if (player) {player.destroy(); // 销毁播放器实例player = null; // 重置播放器实例}initVideo(); // 重新初始化视频连接
};// 初始化视频连接
const initVideo = () => {try {const streamUrl = 'ws://localhost:8080'; // WebSocket 服务器地址status.value = '正在连接...'; // 更新状态信息// 设置连接超时connectionTimeout = setTimeout(() => {if (ws && ws.readyState !== WebSocket.OPEN) {ws.close(); // 如果连接未打开,关闭连接recordError('连接超时'); // 记录连接超时错误}}, 5000);// 创建WebSocket连接ws = new WebSocket(streamUrl);ws.binaryType = 'arraybuffer'; // 设置数据类型为二进制数组let dataReceived = false; // 标记是否收到数据let dataTimer = null; // 数据接收超时计时器ws.onopen = () => {clearTimeout(connectionTimeout); // 清除连接超时计时器status.value = '连接成功,等待数据...'; // 更新状态信息// 设置数据接收超时dataTimer = setTimeout(() => {if (!dataReceived) {recordError('连接成功但未收到有效数据'); // 记录未收到数据错误ws.close(); // 关闭连接}}, 8000);};ws.onmessage = (event) => {// 检查数据包是否有效if (event.data instanceof ArrayBuffer) {dataReceived = true; // 标记已收到数据clearTimeout(dataTimer); // 清除数据接收超时计时器if (event.data.byteLength > 0) {console.log('收到数据包:', event.data.byteLength, new Date().toLocaleTimeString());// 如果播放器未初始化,初始化播放器if (!player) {status.value = '收到数据,初始化播放器...'; // 更新状态信息startPlayer(streamUrl); // 初始化播放器}// 尝试手动处理数据try {if (player && player.source) {const data = new Uint8Array(event.data);// 检查数据是否为MPEG-TS格式if (data[0] === 0x47) { // MPEG-TS同步字节player.source.write(data); // 写入数据到播放器} else {console.warn('收到非MPEG-TS格式数据'); // 警告非预期格式数据}}} catch (e) {console.error('数据处理错误:', e); // 输出数据处理错误信息}}}};// 其他事件处理保持不变...} catch (error) {// 错误处理保持不变...}
};// 初始化播放器
const startPlayer = (streamUrl) => {try {player = new JSMpeg.Player(streamUrl, {canvas: videoCanvas.value, // 指定画布元素autoplay: true, // 自动播放audio: true, // 启用音频audioBufferSize: 512 * 1024, // 音频缓冲区大小loop: true, // 循环播放videoBufferSize: 1024 * 1024 * 2, // 视频缓冲区大小onSourceEstablished: () => {console.log('视频源已建立'); // 输出视频源建立信息status.value = '视频播放中'; // 更新状态信息},onSourceCompleted: () => {console.log('视频源已完成'); // 输出视频源完成信息},onStalled: () => {console.log('播放停滞'); // 输出播放停滞信息}});} catch (error) {recordError(`播放器初始化失败: ${error.message}`); // 记录播放器初始化错误console.error('播放器错误:', error); // 输出播放器错误信息}
};// 组件挂载时初始化视频连接
onMounted(() => {initVideo();
});// 组件卸载前清理资源
onBeforeUnmount(() => {if (connectionTimeout) {clearTimeout(connectionTimeout); // 清除连接超时计时器}ws?.close(); // 关闭 WebSocket 连接player?.destroy(); // 销毁播放器实例
});
</script><style scoped>
.video-container {width: 100%;height: 100%;position: relative; /* 设置容器为相对定位 */
}canvas {width: 100%;height: 100%;background: #000; /* 设置画布背景为黑色 */
}.status {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%); /* 居中显示状态信息 */background: rgba(0,0,0,0.7); /* 半透明背景 */color: #fff; /* 白色文字 */padding: 12px 20px; /* 内边距 */border-radius: 4px; /* 圆角边框 */text-align: center; /* 文本居中 */
}.error-status {color: #ff6b6b; /* 错误状态文字颜色 */
}.retry-btn {margin-top: 10px; /* 按钮顶部外边距 */padding: 5px 10px; /* 按钮内边距 */background: #3498db; /* 按钮背景颜色 */border: none; /* 无边框 */border-radius: 4px; /* 圆角边框 */color: white; /* 按钮文字颜色 */cursor: pointer; /* 鼠标指针样式 */
}.retry-btn:hover {background: #2980b9; /* 按钮悬停背景颜色 */
}
</style>
2.3播放
说明:打开对应文件的路由,播放视频。
3.附件
3.1视频链接
说明:https://live.csdn.net/v/474456
相关文章:
通过 WebSocket 接收和播放 WSS 协议视频流
1.创建wss协议视频 1.1必备包 npm install ws ffmpeg-installer/ffmpeg fluent-ffmpeg 说明:安装以下三个包。 1.2代码实现 说明:创建WebSocket服务器,端口为8080 import { WebSocket, WebSocketServer } from ws; // 导入 WebSocket 和 W…...
HTML 如何改变字体颜色?深入解析与实践指南
网页上的字体颜色是网页设计中至关重要的元素之一,它像字体大小一样,对于提升用户体验起着举足轻重的作用。精心选择和运用字体颜色,能够增强页面的可读性、突出重点信息、营造特定的情感氛围,甚至直接影响用户的视觉感受和品牌认…...
tigase源码学习杂记-组件化设计
前言 tigase官方号称高度抽象和组件化。这篇文章就记录一下我研究组件化的相关设计 概述 我的理解tigase高度组件化是所有的关键的功能的类,它都称之为组件,即只要继承于BasicComponent,它都可以成为组件,BasicComponent类实现…...
十二、人工神经网络及其应用
写在前面 这部分内容老师说很重要,不管是实验还是考试占比都非常大 AIGC的全称是“Artificial Intelligence Generated Content”,即人工智能生成内容。这一术语通常用于指代通过人工智能技术自动生成的各种类型的内容,如文本、图像、音频和视频等。随着AI技术的发展,AIG…...
vscode使用技巧
一、符号定位技巧 跳转到定义 F12 或右键「Go to Definition」跳转到符号定义位置CtrlClick 直接点击符号跳转(支持变量/函数/类) 符号大纲视图 CtrlShiftO 打开文件符号大纲,支持模糊搜索符号名输入: 分类显示符号(…...
测试基础笔记第七天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…...
FOC控制中的正弦PWM和空间矢量PWM对比与理解
参考: simple foc:https://docs.simplefoc.com/docs_chinese/foc_theory博客:https://blog.csdn.net/qq_43332314/article/details/126449398 一、无刷电机基础原理 1., 原理图:至少三个绕组线圈(定子&…...
【Oracle专栏】函数中SQL拼接参数 报错处理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 最近同事反馈了一个很奇怪的问题,即有一个函数,入参是当前年月,主要作用是通过SQL语句将不合规的数据插入到指定表中,插入数据时带上入参的年月参数。当前问题:单独测试SQL没有问题可以执行成功,…...
无意间发现的宝藏项目:开源世界中的演示项目精选合集
🌟无意间发现的宝藏项目:开源世界中的演示项目精选合集 最近在 GitHub 上随手翻了翻 Spring 官方代码仓库,意外发现一个超有趣的演示项目 —— spring-petclinic。一个轻量但结构完整的 Spring 全家桶演示,让人忍不住一探究竟。 这…...
OpenCSG AutoHub v0.5.0 版本发布
OpenCSG AutoHub v0.5.0 版本发布 作为一款智能化自动化操作的浏览器插件,AutoHub不断致力于为用户提供更加高效、便捷的网页浏览体验。本次 v0.5.0版本 的发布,不仅进一步强化了核心功能,还引入了一些创新特性,旨在帮助用户更智…...
基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制研究
基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制实践研究 1. 引言2. 研究背景与意义3. 自动排版工作流的设计原理3.1 文档内容提取与解析3.2 样式参数与格式化规则3.3 智能体API接口调用3.4 自动生成与批量处理3.5 与生成式AI的协同4. 系统架构…...
在 Node.js 中设置响应的 MIME 类型
在 Node.js 中设置响应的 MIME 类型是为了让浏览器正确解析服务器返回的内容,比如 HTML、CSS、图片、JSON 等。我们通常通过设置响应头中的 Content-Type 字段来完成。 ✅ 一、什么是 MIME 类型(Content-Type)? MIME(…...
jsch(shell终端Java版)
学习笔记 Java SSH库使用简介:Apache sshd和JSch(Java Secure Channel) github - fork of the popular jsch library JSch学习笔记 web-shell - gitee代码 - 纯Java实现一个web shell登录Linux远程主机,技术选型 SpringBoot …...
Redis分布式锁RedLock机制详解
一、RedLock机制解决的问题 核心场景:解决传统Redis单节点/主从架构下分布式锁的不可靠问题。当主节点故障时,若从节点未同步锁信息,可能导致多个客户端同时持有锁,破坏互斥性。 典型问题案例: 主从切换锁丢失&…...
Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(五)调试注意的问题
一、几个注意点 1、每个bank中IO的组织形式 1Bank的52Pins分4 Byte Group,每Byte Group 13PinsNibble_up 7Pins Nibble_low 6Pins。 每个nibble一个bitslice_control管理自己的6~7个pins 。 每个pin对应一个bitslice,它内部又包含多个component&#…...
MFC文件-写MP4
下载本文件 本文件将创作MP4视频文件代码整合到两个文件中(Mp4Writer.h和Mp4Writer.cpp),将IYUV视频流,PCM音频流写入MP4文件。本文件仅适用于MFC程序。 使用方法 1.创建MFC项目。 2.将Mp4Writer.h和Mp4Writer.cpp文件复制到项目目录下。 3…...
PyTorch 深度学习实战(39):归一化技术对比(BN/LN/IN/GN)
在上一篇文章中,我们全面解析了注意力机制的发展历程。本文将深入探讨深度学习中的归一化技术,对比分析BatchNorm、LayerNorm、InstanceNorm和GroupNorm四种主流方法,并通过PyTorch实现它们在图像分类和生成任务中的应用效果。 一、归一化技术…...
C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
柱状图QCPBars
一、QCPBars 概述 QCPBars 是 QCustomPlot 中用于绘制柱状图/条形图的类,支持单组或多组柱状图显示,可自定义宽度、颜色和间距等属性。 二、主要属性 属性类型描述widthdouble柱子的宽度(坐标轴单位)widthTypeWidthType宽度计算…...
2025-04-20 李沐深度学习4 —— 自动求导
文章目录 1 导数拓展1.1 标量导数1.2 梯度:向量的导数1.3 扩展到矩阵1.4 链式法则 2 自动求导2.1 计算图2.2 正向模式2.3 反向模式 3 实战:自动求导3.1 简单示例3.2 非标量的反向传播3.3 分离计算3.4 Python 控制流 硬件配置: Windows 11Inte…...
Nginx在微服务架构项目(Spring Cloud)中的强大作用
文章目录 一、Nginx是什么?二、Nginx在微服务架构(Spring Cloud)项目中的作用1.前端静态资源托管2.反向代理后端 API3.负载均衡4.SSL 证书与 HTTPS 支持5.缓存与压缩优化6.安全防护7.灰度发布与流量控制8.跨域处理(CORS࿰…...
Mysql相关知识2:Mysql隔离级别、MVCC、锁
文章目录 MySQL的隔离级别可重复读的实现原理Mysql锁按锁的粒度分类按锁的使用方式分类按锁的状态分类 MySQL的隔离级别 在 MySQL 中,隔离级别定义了事务之间相互隔离的程度,用于控制一个事务对数据的修改在何时以及如何被其他事务可见。MySQL 支持四种…...
解决IDEA创建SpringBoot项目没有Java版本8
问题:idea2023版本创建springboot的过程中,选择java版本时发现没有java8版本,只有java17和java20 原因:spring2.X版本在2023年11月24日停止维护了,因此创建spring项目时不再有2.X版本的选项,只能从3.1.X版本…...
第十章:Agent 的评估、调试与可观测性:确保可靠与高效
引言 随着我们一步步构建出越来越复杂的 AI Agent,赋予它们高级工具和更智能的策略,一个至关重要的问题浮出水面:我们如何知道这些 Agent 是否真的有效、可靠?当它们行为不符合预期时,我们又该如何诊断和修复问题&…...
8节串联锂离子电池组可重构buck-boost均衡拓扑结构 simulink模型仿真
8节串联锂离子电池组 极具创新性 动态分组均衡策略,支持3种均衡模式 1.最高SOC电池给最低SOC电池均衡 2.高能电池组电池给最低SOC电池均衡 3.高能电池组电池给低能电池组电池均衡 支持手动设置均衡开启阈值和终止阈值 均衡效果非常好...
Oracle EBS COGS Recognition重复生成(一借一贷)
背景 月结用户反馈“发出商品”(实际为递延销货成本)不平,本月都是正常操作月结程序,如正常操作步骤如下: 记录订单管理事务处理 (Record Order Management Transactions)收集收入确认信息 (Collect Revenue Recognition Information)生成销货成本确认事件 (Generate COGS …...
Linux命令--将控制台的输入写入文件
原文网址:Linux命令--将控制台的输入写入文件-CSDN博客 简介 本文介绍Linux将控制台的输入写入文件的方法。 方案1:cat > file1(推荐) 普通用法 cat > file1 输入结束后,用CtrlD退出。 示例 使用root权限…...
使用BQ76PL455和STM32的SAE电动方程式电动汽车智能BMS
BMS对任何电动汽车来说都是必不可少的,它可以监控电池的行为,确保安全行驶。 该项目旨在降低成本,同时为每个电池模块提供可扩展的BMS。BQ76PL455具有监测6-16个单元的能力,8通道辅助输入(用于温度监测)和多达15个其他ic用于Daisy…...
OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)
文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9:5.2 loc np.where(res > threshold): 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…...
7.0/Q1,Charls最新文章解读
文章题目:Anti-hypertensive medication adherence, socioeconomic status, and cognitive aging in the Chinese community-dwelling middle-aged and older adults ≥ 45 years: a population-based longitudinal study DOI:10.1186/s12916-025-03949-…...
【第三十二周】CLIP 论文阅读笔记
CLIP 摘要Abstract文章信息引言方法预训练推理Q&A 关键代码实验结果总结 摘要 本篇博客介绍了CLIP(Contrastive Language-Image Pre-training),这是OpenAI于2021年提出的多模态预训练模型,其核心思想是通过对比学习将图像与文…...
在 Ubuntu 系统上安装 PostgreSQL
在 Ubuntu 系统上安装 PostgreSQL 的完整指南: 一、安装 PostgreSQL(最新版本) 1. 更新软件包列表: bash sudo apt update 2. 安装 PostgreSQL 和客户端工具: bash sudo apt install postgresql po…...
【MySQL】数据类型
🏠个人主页:Yui_ 🍑操作环境:Centos7 🚀所属专栏:MySQL 文章目录 前言1. bit类型2.tinyint类型3. float类型4. decimal5. char类型6. varchar5&6 char和varchar的比较7.日期和时间类型8.enum和set总结 …...
Mac上Cursor无法安装插件解决方法
可能是微软的vscode被cursor这些新晋的AI-IDE白嫖够了,所以现在被制裁了,cursor下载不了vscode插件了。需要自己修改扩展商店源。 近期微软调整了 API 鉴权策略或限制了非官方客户端的访问权限。 解决方案 一、找到 product.json 文件 打开终端&…...
PI0 Openpi 部署(仅测试虚拟环境)
https://github.com/Physical-Intelligence/openpi/tree/main 我使用4070tisuper, 14900k,完全使用官方默认设置,没有出现其他问题。 目前只对examples/aloha_sim进行测试,使用docker进行部署, 默认使用pi0_aloha_sim模型(但是文档上没找到对应的&…...
NumPy数组和二维列表的区别
在 Python 中,NumPy 数组和二维列表在性能方面存在诸多不同,下面从存储方式、内存占用、操作速度、缓存局部性这几个角度详细分析。 存储方式 二维列表:它是 Python 内置的数据结构,列表中的每个元素实际上是一个引用࿰…...
学习设计模式《四》——单例模式
一、基础概念 单例模式的本质【控制实例数目】; 单例模式的定义:是用来保证这个类在运行期间只会被创建一个类实例;单例模式还提供了一个全局唯一访问这个类实例的访问点(即GetInstance方法)单例模式只关心类实例的创建…...
构建具备推理与反思能力的高级 Prompt:LLM 智能代理设计指南
在构建强大的 AI 系统,尤其是基于大语言模型(LLM)的智能代理(Agent)时,Prompt 设计的质量决定了系统的智能程度。传统 Prompt 通常是简单的问答或填空式指令,而高级任务需要更具结构性、策略性和…...
NLP 梳理03 — 停用词删除和规范化
一、说明 前文我们介绍了标点符号删除、文本的大小写统一,本文介绍英文文章的另一些删除内容,停用词删除。还有规范化处理。 二、什么是停用词,为什么删除它们? 2.1 停用词的定义 停用词是语言中的常用词,通常语义…...
算法—插入排序—js(小数据或基本有序数据)
插入排序原理:(适合小规模数据) 将数组分为“已排序”和“未排序”两部分,逐个将未排序元素插入到已排序部分的正确位置。 特点: 时间复杂度:平均 O(n),最优(已有序)O(n…...
家庭电脑隐身后台自动截屏软件,可远程查看
7-4 本文介绍一个小软件,可以在电脑后台运行,并且记录电脑的屏幕画面保存下来,并且可以远程提取查看。 可以用于记录长时间运行的软件的执行画面过程,或者用于记录家庭中小孩使用电脑的过程,如果没有好好上网课&…...
【Agent】AI智能体评测基座AgentCLUE-General
note AgentCLUE-General将题目划分为“联网检索”、“数据分析”、“多模态理解”和“多场景组合”任务AgentCLUE-General为每个题目都提供一个标准答案,将Agent智能体的答案与标准答案进行规则匹配判断对错 文章目录 note一、任务划分和场景划分二、答案提取的pro…...
最新iOS性能测试方法与教程
一、工具instrument介绍 使用Xcode的instrument进行测试,instrument自带了很多性能方面的测试工具,如图所示: 二、常见性能测试内容 不管是安卓还是iOS的性能测试,常见的性能测试都要包含这五个方面: 1、内存ÿ…...
多模态大语言模型arxiv论文略读(三十)
Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文标题:Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文作者:Ling Yang, Zhao…...
【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练
摘要:预训练数据集通常是从网络内容中收集的,缺乏固有的领域划分。 例如,像 Common Crawl 这样广泛使用的数据集并不包含明确的领域标签,而手动整理标记数据集(如 The Pile)则是一项劳动密集型工作。 因此&…...
AI大模型发展现状与MCP协议诞生的技术演进
1. 大模型能力边界与用户痛点(2023年) 代表模型:GPT-4(OpenAI)、Claude 3(Anthropic)、通义千问(阿里云)等展现出强大的生成能力,但存在明显局限:…...
从malloc到free:动态内存管理全解析
1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有: int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点: 1.空间开辟的时候大小已经固定 2.数组…...
CSS值和单位
CSS值和单位 CSS 中的值和单位是构建样式的基础,它们定义了属性的具体表现方式。值用于定义样式属性的具体取值,而单位用于指定这些值的度量方式。CSS中常用的值和单位如下: 1.长度单位 px : 像素,绝对单位 em : 相对于元素的字…...
Redis高级篇之I/O多路复用的引入解析
文章目录 一、问题背景1. 高并发连接的管理2. 避免阻塞和延迟3. 减少上下文切换开销4. 高效的事件通知机制5. 简化编程模型6. 低延迟响应本章小节 二、I/O多路复用高性能的本质1. 避免无意义的轮询:O(1) 事件检测2. 非阻塞 I/O 零拷贝:最大化 CPU 利用率…...
FTP协议命令和响应码
文章目录 📦 一、什么是 FTP 协议?🧾 二、FTP 常见命令(客户端发送)📡 三、FTP 响应码(服务端返回)📌 响应码分类(第一位)✅ 常见成功响应码&…...