用 Python 构建一个简单的本地视频流媒体服务器
你是否曾经想过在本地网络上轻松地将电脑上的视频分享给手机或平板电脑观看?也许你下载了一部电影,想在客厅的智能电视上播放,却不想费力地拷贝文件。今天,我们将深入分析一个 Python 脚本,它使用 wxPython
创建图形用户界面 (GUI),并结合 Python 内建的 http.server
和 socketserver
模块,实现一个简单的视频流媒体服务器。
C:\pythoncode\new\output\VideoStreamServer.py
这个脚本让你能够:
- 通过 GUI 选择一个本地视频文件。
- 在本地网络上启动一个 HTTP 服务器。
- 通过浏览器访问服务器地址,直接观看所选视频。
让我们一步步解析这个代码的核心功能和实现细节。
代码概览
# 必要的库导入
import wx # GUI 库
import os # 操作系统功能,如路径处理
import http.server # 基础 HTTP 服务器
import socketserver # 服务器框架
import threading # 支持服务器后台运行
import urllib.parse # URL 编码/解码
import socket # 网络功能,获取 IP
import webbrowser # 打开浏览器
from pathlib import Path # (在此代码中未深度使用,但通常用于路径操作)
import sys # 用于标准输出重定向和异常信息
核心组件分析
CustomTCPServer
类:增强型服务器基础
class CustomTCPServer(socketserver.TCPServer):allow_reuse_address = True # 关键!允许快速重启服务器def server_bind(self):self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 再次确保地址重用self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 启用 TCP Keep-Alivesuper().server_bind()def handle_error(self, request, client_address):# ... (优雅地处理非连接中断的错误) ...if not isinstance(error_value, (ConnectionResetError, ConnectionAbortedError, BrokenPipeError)):print(f"Error processing request from {client_address}:")traceback.print_exc()
- 这个类继承自
socketserver.TCPServer
,但做了一些重要的改进: allow_reuse_address = True
和setsockopt(socket.SO_REUSEADDR, 1)
:这是非常实用的设置。它允许服务器在关闭后立即重新启动并绑定到同一个端口,即使之前的连接还处于 TIME_WAIT 状态。这在开发和调试时尤其有用。setsockopt(socket.SO_KEEPALIVE, 1)
:启用 TCP Keep-Alive 机制,有助于检测和清理半开连接,增强服务器的健壮性。handle_error
方法:覆盖了基类的方法,用于更精细地处理错误。它特别忽略了常见的客户端连接中断错误(如ConnectionResetError
,BrokenPipeError
),这些错误在流媒体场景下很常见(例如用户关闭浏览器或网络不稳定),通常不需要作为严重错误记录。对于其他类型的错误,它会打印详细的追溯信息。
VideoStreamerApp
和VideoStreamerFrame
类:GUI 实现 (wxPython
)
VideoStreamerApp
: 这是标准的wxPython
应用程序入口点,负责初始化和显示主窗口 (VideoStreamerFrame
)。VideoStreamerFrame
: 这是应用程序的主窗口,包含了所有的用户界面元素和交互逻辑。__init__
: 初始化窗口,设置标题、大小,并调用InitUI
来构建界面。它还存储了应用程序的状态,如选定的视频文件路径 (selected_video
)、服务器实例 (server
)、端口 (server_port
) 和运行状态 (server_running
)。InitUI
:- 使用
wx.Panel
作为容器,wx.BoxSizer
(垂直vbox
和水平hbox
) 来管理布局,确保控件能自适应窗口大小。 - 创建了核心控件:
- “选择视频文件” 按钮 (
btn_select
):触发OnSelectVideo
。 - 静态文本 (
st_path
):显示选中的文件路径。 - “启动服务器” / “停止服务器” 按钮 (
btn_start
,btn_stop
):触发OnStartServer
/OnStopServer
,并根据服务器状态启用/禁用。 - 静态文本 (
st_status
,st_url
):显示服务器状态和访问 URL。 - “在浏览器中打开” 按钮 (
btn_open_browser
):触发OnOpenBrowser
。 - 多行只读文本框 (
log_area
):用于显示服务器日志。 - 帮助文本 (
st_help
):提供基本使用说明。
- “选择视频文件” 按钮 (
- 日志重定向:通过
sys.stdout = self.LogRedirector(self.log_area)
将所有print
输出重定向到 GUI 的日志区域。
- 使用
LogRedirector
(嵌套类): 一个简单的类,实现了write
方法。关键在于它使用wx.CallAfter(self.text_ctrl.AppendText, string)
,确保即使日志信息来自其他线程(如服务器线程),也能安全地更新 GUI 控件(wxPython
的 GUI 更新必须在主线程进行)。OnSelectVideo
: 使用wx.FileDialog
弹出文件选择对话框,让用户选择视频文件。支持常见的视频格式 (.mp4
,.avi
,.mkv
,.mov
)。get_local_ip
: 一个实用函数,尝试通过连接到一个公共 IP (如 Google DNS) 来获取本机的局域网 IP 地址。这是为了方便其他设备访问。如果失败,则回退到127.0.0.1
。OnStartServer
:- 检查是否已选择视频。
VideoHandler
(嵌套类):这是处理 HTTP 请求的核心。它继承自http.server.SimpleHTTPRequestHandler
。log_message
: 覆盖此方法,将 HTTP 服务器的日志(如 GET 请求)也打印到 GUI 日志区域。handle_one_request
: 添加了额外的异常捕获,专门处理请求处理过程中的连接错误。do_GET
: 这是最重要的部分,处理客户端的 GET 请求:- 根路径 (
/
): 当用户访问服务器根目录时,生成并发送一个简单的 HTML 页面。这个页面包含一个 HTML5<video>
标签,其src
指向/video/<视频文件名>
。文件名通过urllib.parse.quote
进行 URL 编码,以处理空格或特殊字符。页面还包含一些基本的 CSS 样式。 - 视频路径 (
/video/...
): 当浏览器请求视频数据时:- 内容类型 (
Content-Type
): 根据视频文件的扩展名(.mp4
,.avi
,.mkv
,.mov
)设置正确的 MIME 类型。这对浏览器正确解析视频至关重要。 - 文件大小 (
Content-Length
): 获取视频文件的总大小。 - 范围请求 (
Range
Header / HTTP 206): 这是实现视频**拖动(seeking)**的关键。现代浏览器播放视频时会发送带有Range
头部的请求,表示只需要文件的一部分。代码检查Range
头部,如果存在:- 解析请求的字节范围 (
start_range
,end_range
)。 - 发送
206 Partial Content
状态码。 - 设置
Content-Range
头部,告诉浏览器发送的是哪部分数据以及文件总大小 (e.g.,bytes 1000-1999/50000
)。 - 设置
Content-Length
为本次发送的数据块大小。 - 打开视频文件,使用
f.seek(start_range)
定位到请求的起始位置。 - 分块读取和发送: 使用
while
循环和f.read(chunk_size)
(例如 64KB) 读取文件块,并通过self.wfile.write(data)
发送给客户端,直到发送完请求的范围。这样做可以避免一次性将大文件读入内存,并且能逐步将数据流式传输给客户端。同时,在发送过程中捕获BrokenPipeError
等连接错误,优雅地停止发送。 - 包含了一个
max_chunk
(10MB) 限制,避免一次性响应过大的范围请求,进一步优化流式传输。
- 解析请求的字节范围 (
- 完整文件请求 (HTTP 200): 如果没有
Range
头部,则发送200 OK
状态码,并设置Content-Length
为整个文件大小。同样使用分块读取和发送的方式传输整个文件。 - 错误处理: 在文件读取、发送过程中都添加了异常处理,特别是针对客户端断开连接的情况。
- 内容类型 (
- 根路径 (
- 服务器启动逻辑:
- 尝试在
self.server_port
(默认为 8000) 启动CustomTCPServer
。 - 端口查找: 如果默认端口被占用 (
OSError
),会自动尝试下一个端口,最多尝试 10 次。 - 后台线程: 使用
threading.Thread
在后台启动服务器的serve_forever()
方法,这样服务器运行就不会阻塞 GUI 主线程。daemon=True
确保主程序退出时服务器线程也会随之结束。 - 更新 GUI 状态(按钮、状态文本、URL)。
- 尝试在
OnStopServer
:- 同样使用
threading.Thread
来调用self.shutdown_server()
。这是因为server.shutdown()
必须从不同于serve_forever()
运行的线程中调用。 - 立即更新 GUI 状态。
- 同样使用
shutdown_server
: 在单独的线程中安全地调用self.server.shutdown()
和self.server.server_close()
来停止服务器并释放端口。OnOpenBrowser
: 使用webbrowser.open
在系统默认浏览器中打开服务器的本地地址。OnClose
: 当用户关闭窗口时触发。如果服务器正在运行,会先调用OnStopServer
停止服务器。重要:在退出前,通过sys.stdout = sys.__stdout__
恢复标准输出,否则程序关闭后可能出现问题。event.Skip()
允许关闭事件继续传递,正常关闭窗口。
- 主程序入口 (
if __name__ == "__main__":
)
- 标准的 Python 脚本入口。创建
VideoStreamerApp
的实例并调用app.MainLoop()
来启动 wxPython 事件循环,显示 GUI 并等待用户交互。
运行结果
相关文章:
用 Python 构建一个简单的本地视频流媒体服务器
你是否曾经想过在本地网络上轻松地将电脑上的视频分享给手机或平板电脑观看?也许你下载了一部电影,想在客厅的智能电视上播放,却不想费力地拷贝文件。今天,我们将深入分析一个 Python 脚本,它使用 wxPython 创建图形用…...
汇丰xxx
1. Spring Boot 的了解,解决什么问题? 我的理解: Spring Boot 是一个基于 Spring 框架的快速开发脚手架,它简化了 Spring 应用的初始搭建和开发过程。解决的问题: 简化配置: 传统的 Spring 应用需要大量的…...
ruby基础语法
以下是 Ruby 基础语法的简明总结,适合快速入门: 一、变量与常量 局部变量 小写字母或下划线开头,作用域为当前代码块。 name "Alice" _age 20实例变量 以 开头,属于对象实例。 name "Bob"类变量 以 开头…...
智体OS-V3.1版:新增了rt-datalink底层数据链通讯,实现【无网络】本机使用
##智体OS-V3.1版本发布 更新简介 dtns.os智体OS-V3.1版:新增了rt-datalink底层数据链通讯(使用本地局域网的websocket端口通讯),解决了本机【无网络】正常使用的问题。 更新内容 dtns.connector支持使用新的rt-datalink与智体…...
Windows系统安装Git以及Git常用命令介绍
本文主要介绍Windows系统安装Git的方法,以及Git常用命令介绍。 一、下载Git 官网: Git - Downloads (git-scm.com) 根据自己的系统选择 我的是64位的Windows系统,选择对应的安装包,点击后开始下载 等待下载完成 二、安装Git 双…...
HTML 开发者的智能助手:通义灵码在 VSCode 中的应用
引言 在 HTML 开发领域,提高编码效率和质量是每位开发者追求的目标。通义灵码,作为一款由阿里云技术团队开发的智能编码助手,能够通过其强大的 AI 能力,为 HTML 开发者提供包括代码自动补全、智能注释、代码优化等多方面的支持。…...
MySQL随机获取记录之方法(The Method of Randomly Obtaining Records in MySQL)
MySQL中如何随机获取一条记录 随机获取一条记录是在数据库查询中常见的需求,特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中,有多种方法可以实现随机获取一条记录,每种方法都有其适用的情况和性能特点。在本文中,我们将…...
ngx_core_module 的 create_conf
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module-CSDN博客 定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */…...
41--华为IPSec主备链路实验:当加密隧道遇上“双保险“
🚦 华为IPSec主备链路实验:当加密隧道遇上"双保险" “如果你的IPSec隧道只有一条路,那就像走钢丝不系安全带——刺激但危险!” —— 本文将用华为设备打造主备双加密通道,结合IP-link智能检测,让…...
Reactive编程框架与工具
文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka(Actor模型)Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x(事件驱动&…...
vi/vim常用快捷键
那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...
初始JavaEE篇 —— SpringBoot 统一功能处理
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 前言 拦截器 基本使用 拦截器的路径配置 统一数据返回格式 统一异常处理 前言 在实际开发中,某些功能需要强…...
Spring AI Alibaba 文档检索使用
一、文档检索 (Document Retriever)简介 1、核心概念 文档检索(DocumentRetriever)是一种信息检索技术,旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…...
遍历算法及其应用详解
李升伟 整理 什么是遍历? 遍历是指按照某种规则或顺序,系统地访问数据结构(如树、图等)中的每个节点一次且仅一次的过程。遍历是算法设计中的基本操作,用于访问、检查或修改数据结构中的所有元素。 主要遍历算法 1…...
.NET-EFCore基础知识
.NET EF Core(Entity Framework Core)是微软开发的一款开源的对象关系映射(ORM)框架,用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识: 1. 什么是 EF Core EF Core 是.NET 平…...
R语言基础包可视化(一:axis函数)
R语言基础包可视化(一:axis函数) 背景axis函数(坐标轴函数)各参数的图片示例hadj和padjline和poslty,lwd,lwd.ticksgap.axis总结背景 之前在介绍正态Q-Q图的过程中,画过标准正态分布的随机数、分数数、分布函数、密度函数的图像,相关的文章连接参考此处:R语言正态Q-Q图…...
Axure疑难杂症:垂直菜单折叠与展开(玩转垂直菜单)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:垂直菜单折叠与展开 主要内容:折叠与展开效果 应用场景:PC后台菜单、动态下拉菜单、商品分类选择等折叠与展开场景 案例展示: 案例视频: 垂直菜单折叠与展开效果 正文内容: 关于垂直菜单的折叠与…...
docker 中跑faster-whisper 教程(1050显卡)
之前我本地机器运行faster-whisper 会报错类似 Could not load library libcudnn_ops_infer.so.8github 上也有类似的情况 :https://github.com/SYSTRAN/faster-whisper/issues/516#issuecomment-2785038635 缺少.so.8 文件,我通过以下方式,…...
MySQL 在 CentOS 7 环境安装完整步骤
1. 卸载已有环境(MariaDB/旧版MySQL) 1.停止 MariaDB 服务 systemctl stop mariadb.service 2.检查并卸载 MariaDB/MySQL 安装包 rpm -qa | grep mariadb # 检查 MariaDB 相关包 rpm -qa | grep mysql # 检查 MySQL 相关包 sudo yum remo…...
下一代智能爬虫框架:ScrapeGraphAI 详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、ScrapeGraphAI 概述1.1 ScrapeGraphAI介绍1.2 核心特点1.3 工作流程1.4 关键模块1.5 对比传统爬虫框架1.6 安装二、基础操作2.1 自定义解析规则2.2 数据后处理2.3 分布式爬取三、高级功能3.1 多步骤交互采集3.2 动态…...
C++-ffmpeg-2-3-工厂模式封装SDL-9-7
1.接口设计 2.窗口渲染器和材质初始化 3.渲染Draw并测试渲染YUV 4.渲染画面随窗口大小自动缩放并抗锯齿 5.清理接口和接收窗口退出事件 1.接口设计:原则 主要的实现步骤: main的流程: 1打开文件 yuv_file.open("400_300_25.yuv&quo…...
下载极客漫画——Beautiful Soup实用案例
文章目录 一、背景介绍 二、实现思路 三、效果图 四、构思 五、实现细节 1. 第一步下载网页 2. 寻找和下载漫画图像 3. 保存图像,找到前⼀张漫画 六、完整代码 七、程序输出 八、附录 九、总结 一、背景介绍 XKCD网站是一个关于浪漫、隐喻、数字、以及…...
【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施
1. 背景 大模型(LLM)和多模态大模型(MLLM)利用基于Transformer的架构获得了很迅速的发展。为满足对这些模型的训练和轻量级微调需求,目前已有一些开源框架,如LLaMA-Factory、Firefly、FastChat、Axolotl和LMFlow等。但这些框架在支持的模型、技术和功能上…...
利用 schedule 模块在每日上午每 3 秒执行任务
一、schedule 模块基础原理与功能概述 schedule 模块维护了一个任务队列,每个任务都关联着一个特定的时间触发器和对应的执行函数。当系统时间到达任务设定的触发时间时,模块会从队列中取出相应的任务并执行其关联的函数。这种设 计模式使得开发者无需过多关注底层的时间处理…...
ruby超高级语法
以下是 Ruby 中一些 极度硬核 的语法和底层特性,涉及元编程的深渊、虚拟机原理、语法黑魔法等,适用于追求极限的 Ruby 开发者: 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def foo; "B…...
Java Stream API:现代化集合处理的艺术
Java Stream API:现代化集合处理的艺术 引言 在Java 8中引入的Stream API彻底改变了我们处理集合数据的方式。它不仅仅是一个新的工具集,更代表了一种声明式、函数式的编程范式。本文将深入探讨Java Stream的核心概念、使用场景和最佳实践。 一、什么是Stream? Stream(…...
ruby高级语法
以下是 Ruby 高级语法的详细总结,涵盖元编程、模式匹配、闭包、并发模型等核心主题: 一、元编程(Metaprogramming) 1. 动态定义方法 class DynamicClass# 使用 define_method 动态定义方法["foo", "bar"].e…...
特权FPGA之UART串口
0.简介 通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232和RS 485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250,1645…...
oracle 索引失效
在 Oracle 11g 中,索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等,解决方法需结合版本特性(如虚拟列、索引跳跃扫描)。通过执行计划分析、统计信息维护和合理使用提示(Hints),…...
MySQL查看binlog执行情况
因数据丢失,被要求使用binlog查看 执行SQL的具体情况。 拿到数据库压缩包,解压缩获得文件和文件夹若干。 如图,有17个binlog文件,目标数据库名应为corr。 已知这个数据库是安装在windows下,版本8.0. 先下载一个mysq…...
kotlin,Android,jetpack compose,日期时间设置
AI生成,调试出来学习,这些小组件会用了,就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...
sql-labs靶场 less-2
文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
ssh密钥连接远程服务器并用scp传输文件
ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH...
【锂电池SOH预测】PSO-BP锂电池健康状态预测,锂电池SOH预测(Matlab完整源码和数据)
预测效果 基于PSO-BP算法的锂电池健康状态预测研究 一、引言 1.1 研究背景与意义 在当今社会,锂电池凭借其高能量密度、长寿命及环境友好等特性,在现代能源系统中占据着举足轻重的地位。从消费电子领域如智能手机、笔记本电脑,到动力领域中…...
找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索
一、市场前景:为什么现在需要"找搭子"? 孤独经济爆发 超60%年轻人存在"精准陪伴"需求(2024社交报告) 传统社交App无法满足"非婚恋、非熟人"的中间态需求 线下活动复苏 剧本杀/飞盘等兴趣活动年增…...
《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》
前言 在数字化时代背景下,订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统,通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架,结合 MyBatis …...
软件需求分析习题汇编
需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对( )的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生( ) A. 项目开发…...
51单片机的汇编伪指令
目录 一、ORG 汇编起始地址命令 1、功能 2、语法格式 3、使用示例 4、注意事项 二、END 汇编终止命令 1、功能 2、语法格式 3、使用示例 4、注意事项 三、EQU 赋值命令 1、功能 2、语法格式 3、使用示例 4、注意事项 四、BIT 位定义命令 1、功能 2、语法格式…...
深入探究Python的re模块及其在爬虫中的应用
深入探究Python的re模块及其在爬虫中的应用 一、引言 在Python的强大生态系统中,re模块作为处理正则表达式的核心工具,发挥着举足轻重的作用。正则表达式是一种描述文本模式的强大语言,能够高效地进行字符串的匹配、查找、替换等操作。无论…...
aosp13增加摄像头控制功能实现
A13中,可以要求做一个开关来控制摄像头是否可用,约束所有使用摄像头的应用。思路:设置中增加开关设置一个属性值,在摄像头调用实现层增该值判断即可 一 开关的开发: 设置-安全中增加开关选项 代码部分&#x…...
Kotlin 之 vararg 参数向下传递的几种方式
在 Kotlin 中,vararg 参数是一种特殊的参数类型,用于表示可变数量的参数。vararg 参数是否可以向下传递,需要根据目标方法的参数类型来决定。 1、目标方法参数也是vararg类型,可直接向下传递 在 method 方法中,通过 …...
Kotlin学习
kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭,推荐几款开源的Kotlin的Android项目...
AI写程序:图片批量重命名工具 - 自动化整理您的图片库
图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工具,用于批量重命名文件夹中的图片文件。它能够递归处理选定文件夹及其所有子文件夹中的图片,按照…...
git命令自动拉去远程分支到本地
是的,可以通过 Git 命令自动拉取远程分支并在本地创建同名分支。以下是几种方法: 方法 1:直接拉取远程分支并创建同名本地分支 git fetch origin <远程分支名> # 拉取远程分支 git checkout -b <本地分支名> origin/<远程分…...
[创业之路-364]:穿透表象:企业投资的深层逻辑与误区规避
前言: 透过现象看本质 企业一生与人生相似 看企业如同看人 三岁看大,七岁看老 三十年河东,三十年河西 企业也有品行、文化、气质、性格、赚钱、生命周期与赚钱曲线 投资公司的目的是未来赚钱,赚未来赚钱。投资创业中的企业主要看…...
UE5 蓝图里的声音
文章目录 支持的格式设置循环播放在场景中放置音频设置音频的衰减与不衰减在UI动画中播放声音使用蓝图节点播放声音按钮本身就可以播放声音 支持的格式 支持:WAV 不支持:MP3 设置循环播放 双击音频,打开音频设置,勾选Looping …...
Spring Boot 邮件发送配置遇到的坑:解决 JavaMailSenderImpl 未找到的错误
在使用 Spring Boot 开发时,我们经常需要通过邮件发送功能来实现某些业务逻辑。为了方便快速集成,Spring Boot 提供了一个非常好用的 spring-boot-starter-mail 模块,帮助我们轻松发送邮件。但是,在配置过程中可能会遇到一些问题&…...
路由表的最终地址 root 路由跟踪,最终到哪里去
在路由跟踪(如tranceroute或trancert命令)中,最终地址是目标主机或服务器的IP地址或域名所对应的实际网络地址; 路由跟踪的目的是显示数据包从本地主机到目标主机所经过的每一跳路由器或网络节点,而最终地址是数据包要到达的目标设备。 1.路由跟踪的最终地址 目标主机:路…...
Docker面试全攻略(一):镜像打包、容器运行与高频问题解析
引言 在云原生和微服务架构盛行的今天,Docker 已成为后端开发的必备技能。本文从 面试高频考点 出发,系统梳理 Docker 镜像构建、容器运行的核心知识点,助你轻松应对 Docker 相关的技术面试! 一、Docker 镜像构建核心(面试必问) 1. Dockerfile 核心命令与参数 FROM:基…...
方法的重写
目录 1、重写的概念2、方法重写的规则3、重写 VS 重载 1、重写的概念 重写,也称为覆盖,是子类对父类的非构造、非静态、非 final 修饰、非 private 修饰的方法的实现过程的重新编写。重写可以让子类根据需要来实现父类的方法。方法重写是子类与父类的一…...