使用 Ktor 构建现代 Android 应用的后端服务
使用 Ktor 构建现代 Android 应用的后端服务
前言
在移动互联网时代,Android 应用对后端服务的实时性与性能要求越来越高,而传统的后端框架在一些场景中存在复杂度高、扩展性不足等问题。Ktor 作为 JetBrains 推出的异步 Web 框架,充分利用 Kotlin 协程的优势,能够高效构建轻量、易扩展、易维护的服务端应用。本文将通过丰富的实践案例、代码示例和最佳实践,帮助你深入了解 Ktor 的核心特性与应用场景,并指导你如何将它与现代 Android 开发完美结合。🚀
1. Ktor 简介及架构设计原理
Ktor 是一个基于 Kotlin 的异步 Web 框架,具有灵活的模块化设计与极高的性能优势。其核心设计思想包括:
- 模块化插件体系:允许开发者自由组合和扩展功能,如内容协商、认证、日志记录等。
- 基于 Kotlin 协程:天然支持非阻塞异步编程,充分发挥 Kotlin 语言的简洁与高效。
- 轻量化与高扩展性:可通过自定义中间件插件,灵活应对不同业务场景。
其架构图大致如下所示:
┌─────────────────────────────┐
│ Ktor Application │
│ ┌───────────────┐ ┌───────┐│
│ │ Routing │ │ Plugins││
│ └───────────────┘ └───────┘│
│ │ ▲ │
│ Request Processing │ │
│ │ │ │
│ ┌──────────────────────┐ │
│ │ Engine (Netty, etc.)│◄──┘
│ └──────────────────────┘
└─────────────────────────────┘
这种设计不仅实现了简单易用的 API,还允许你根据项目需求灵活切换底层引擎(例如 Netty、Jetty)。
2. Ktor 与其他后端框架对比
与 Spring Boot、Node.js 等后端框架相比,Ktor 具有以下优势:
- 简洁性:Ktor 的 DSL 使得路由和插件的声明非常简单直观,代码行数大幅减少。
- 性能优势:依托 Kotlin 协程技术,实现了高并发情况下的非阻塞调用。
- 轻量级:无需像 Spring Boot 那样加载大量不必要的 Bean,启动速度快,非常适合微服务和轻量级应用。
- 高度可定制:开发者可以根据自身需求自由组合中间件,而非依赖固定的架构模式。
当然,Spring Boot 拥有成熟的生态和社区支持,适合大型复杂系统;Node.js 则在 I/O 密集型场景下表现出色。选择哪种框架要根据具体业务需求进行权衡。⚖️
3. 搭建开发环境
在开始使用 Ktor 开发之前,你需要准备好以下开发环境:
- JDK 11 及以上版本
- IntelliJ IDEA:推荐使用 JetBrains 系列 IDE 获取最佳 Kotlin 开发体验。
- Gradle 或 Maven:项目构建工具。
- Ktor 框架依赖:可以通过 Gradle 添加依赖,例如:
dependencies {implementation("io.ktor:ktor-server-netty:2.3.0")implementation("io.ktor:ktor-server-core:2.3.0")implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")// 其他插件依赖...
}
配置好开发环境后,即可开始搭建 Ktor 项目,并根据需要引入其它常用依赖。🔧
4. 使用 Ktor 构建 RESTful API 实战
本部分演示如何用 Ktor 快速搭建一个简单的 RESTful API,并处理 GET、POST 请求。
4.1. 创建 Ktor 应用
在项目的主入口中配置 Ktor 应用:
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)@Suppress("unused") // Referenced in application.conf
fun Application.module() {install(ContentNegotiation) {json() // 使用 Kotlinx 序列化}routing {// GET 请求示例get("/hello") {call.respondText("Hello, Ktor! 😊", ContentType.Text.Plain)}// POST 请求示例post("/user") {val user = call.receive<User>()// 简单模拟保存数据call.respond(HttpStatusCode.Created, "User ${user.name} created!")}}
}@Serializable
data class User(val name: String, val email: String)
运行后,通过访问 /hello
路由即可看到响应效果。该示例展示了如何安装内容协商插件、定义路由和处理请求。📡
4.2. 示例说明
- ContentNegotiation 插件:通过自动处理 JSON 序列化与反序列化,简化数据交互。
- Routing:利用 DSL 风格定义 URL 路由,直观而易扩展。
- 请求处理:通过
call.receive<T>()
自动映射 JSON 数据为 Kotlin 对象。
此案例是一个简单的入门示例,但已经展示了 Ktor 高效且灵活的编程模型。
5. Ktor 中的核心模块详解
Ktor 主要通过模块化插件来扩展功能,下面介绍几个核心模块:
5.1. 路由与请求处理
Ktor 的路由模块基于 DSL 编写,支持动态路由参数、嵌套路由及条件匹配。例如:
routing {route("/api") {get("/items/{id}") {val id = call.parameters["id"]call.respondText("Requested item id: $id")}post("/items") {// 处理创建逻辑}}
}
这种嵌套路由让业务逻辑更加清晰,同时方便针对同一路径设定公共中间件。📌
5.2. 插件(Features)
Ktor 通过插件扩展功能,常见的插件包括:
- ContentNegotiation:自动转换请求与响应的数据格式(JSON、XML 等)。
- Authentication:内置认证插件支持多种认证机制(Basic、JWT、OAuth 等)。
- CallLogging:记录 API 调用日志,有助于开发者调试和监控。
插件的安装只需简单调用 install()
方法,如下所示:
install(Authentication) {basic(name = "auth") {realm = "Ktor Server"validate { credentials ->if (credentials.name == "admin" && credentials.password == "password") {UserIdPrincipal(credentials.name)} else null}}
}
这种插件机制使得 Ktor 可以灵活应对不同的业务需求,无论是认证、日志还是错误处理,都可以通过简单配置实现。🔑
5.3. 异常处理与拦截器
利用 Ktor 的拦截器机制,可以对请求进行前置处理或捕捉异常。例如:
install(StatusPages) {exception<Throwable> { call, cause ->call.respond(HttpStatusCode.InternalServerError, "Internal server error: ${cause.localizedMessage}")}
}
这种设计保证了在出错时能够统一返回友好的错误信息,提升用户体验。
6. Kotlin 协程与 Ktor 的深度结合
Kotlin 协程是 Ktor 的核心动力,让异步编程变得异常简单。与传统回调模式相比,协程能够让代码保持同步编写风格,而实际运行时却是非阻塞的。
6.1. 协程基础
协程使得并发编程更直观,例如:
suspend fun fetchData(): String {delay(1000L) // 模拟异步网络请求return "Data fetched"
}routing {get("/data") {val result = fetchData() // 非阻塞调用call.respondText(result)}
}
这段代码中,delay
不会阻塞线程,其他任务依然可以正常执行。👌
6.2. 协程在高并发场景下的优势
在高并发场景中,Ktor 利用协程实现了高效的线程复用,大大降低了服务器资源占用。无论是短时间内大量并发请求,还是长连接场景下的持续交互,Ktor 都能提供稳定的性能保证。这也是其在性能调优中占有一席之地的重要原因。🚀
7. 常用插件与实战讲解
在实际项目中,往往需要引入更多功能,下面介绍几个常用插件及其实战使用场景。
7.1. 内容协商(Content Negotiation)
内容协商插件能够自动将请求的数据格式与服务器响应进行映射,极大简化了数据处理环节。示例如下:
install(ContentNegotiation) {json {prettyPrint = trueisLenient = true}
}
通过这种方式,我们可以方便地处理 JSON 数据,而无需手动解析。
7.2. 身份认证(Authentication)
提供了多种认证方式,下面以 JWT 认证为例:
install(Authentication) {jwt {realm = "ktor sample app"verifier(JwtConfig.verifier)validate {if (it.payload.audience.contains(JwtConfig.audience)) JWTPrincipal(it.payload) else null}}
}
这种配置能够有效保证 API 的安全性,避免未授权访问。🔒
7.3. 日志记录(CallLogging)
日志记录插件能够详细记录每次请求,便于后续调试和运维监控:
install(CallLogging) {level = Level.INFOfilter { call -> call.request.path().startsWith("/api") }
}
这对于实际开发中的问题排查和性能优化有着不可忽视的作用。📜
8. Android 客户端调用后端 API
在 Android 应用中调用 Ktor 后端服务时,可以选择 Retrofit 或 Ktor Client。下面以 Ktor Client 为例演示如何集成调用。
8.1. 集成 Ktor Client
首先,引入 Ktor Client 依赖:
dependencies {implementation("io.ktor:ktor-client-core:2.3.0")implementation("io.ktor:ktor-client-cio:2.3.0")implementation("io.ktor:ktor-client-serialization:2.3.0")
}
8.2. 示例代码
在 Android 项目中,通过 Ktor Client 发起请求:
class ApiService {private val client = HttpClient(CIO) {install(ContentNegotiation) {json()}}suspend fun fetchData(): String {return client.get("http://your-server-address/api/data").bodyAsText()}
}
在 Activity 或 ViewModel 中调用:
lifecycleScope.launch {try {val result = ApiService().fetchData()// 更新 UI 或处理数据} catch (e: Exception) {Log.e("ApiError", "Error fetching data", e)}
}
这种方式有效简化了网络请求的封装,并充分利用协程进行异步操作。📱
9. 性能调优与部署建议
在高并发场景下,Ktor 的性能调优和部署方案尤为重要。以下是一些实用建议:
9.1. 异步非阻塞设计
充分利用协程与异步 I/O 模型,确保每次请求都能够高效执行。注意避免在协程中做耗时的阻塞操作,若必须使用阻塞调用,可考虑使用专用线程池进行管理。
9.2. 使用 Netty/Jetty 等高性能引擎
Ktor 默认支持多种引擎,根据场景选择合适的引擎:
- Netty:适用于高并发场景,性能表现优异。
- Jetty:轻量且易于嵌入,适合中小型应用部署。
通过对比测试,选择与项目需求最匹配的底层引擎,能够有效提升整体系统响应速度。⚡
9.3. 监控与调优
引入监控工具(如 Prometheus、Grafana)监控服务运行时的内存、CPU 和网络指标,及时发现瓶颈。使用 APM 工具对关键 API 进行性能追踪,定位慢请求点。📈
9.4. 部署建议
- 使用 Docker 封装服务:保证在不同环境中一致性部署。
- CI/CD 集成:通过 GitLab CI、Jenkins 等工具实现自动化测试与部署。
- 负载均衡:在高并发情况下,通过 Nginx 等反向代理服务器进行负载均衡。
10. 使用 Ktor 构建 WebSocket 实时通讯服务
除了传统的 HTTP 请求,实时通讯在很多应用中必不可少。Ktor 提供了良好的 WebSocket 支持,下面是一个简单的示例。
10.1. WebSocket 服务端示例
在 Ktor 应用中安装 WebSocket 插件:
install(WebSockets)routing {webSocket("/chat") {send("欢迎进入聊天室!😊")for (frame in incoming) {frame as? Frame.Text ?: continueval receivedText = frame.readText()// 将收到的消息广播给所有连接的客户端send("服务器收到消息:$receivedText")}}
}
以上代码实现了一个简单的聊天室功能,客户端连接后可实时发送和接收信息。
10.2. 客户端调用
Android 客户端同样可使用 Ktor Client 的 WebSocket 支持:
suspend fun chat() {client.webSocket(host = "your-server-address", port = 80, path = "/chat") {send("Hello from Android!")for (frame in incoming) {frame as? Frame.Text ?: continueLog.d("WebSocket", "Received: ${frame.readText()}")}}
}
这种实时通讯方案十分适合聊天室、实时数据更新等应用场景。💬
11. 单元测试与集成测试
良好的测试策略可以帮助你在项目中及时发现问题,并确保代码在不断迭代中的稳定性。Ktor 项目中常用的测试方法包括:
11.1. 单元测试
利用 Ktor 提供的测试工具,可以在不启动整个服务器的情况下模拟请求。例如:
class ApplicationTest {@Testfun testHelloEndpoint() = testApplication {application {module()}client.get("/hello").apply {assertEquals(HttpStatusCode.OK, status)assertTrue(bodyAsText().contains("Hello, Ktor"))}}
}
11.2. 集成测试
通过整合数据库、认证等真实外部依赖,进行端到端测试,确保每个模块在集成环境下都能正常工作。可以借助 Docker Compose 构建临时测试环境,实现完全隔离测试。🔍
12. 项目结构设计与模块划分
在构建大型后端服务时,合理的项目结构设计能够极大降低维护成本。推荐采用以下结构:
├── src
│ ├── main
│ │ ├── kotlin
│ │ │ └── com.example.app
│ │ │ ├── Application.kt # 启动入口与配置
│ │ │ ├── routes # 路由模块
│ │ │ ├── controllers # 业务逻辑处理
│ │ │ ├── models # 数据模型
│ │ │ ├── services # 服务层,处理业务逻辑与数据交互
│ │ │ └── plugins # 自定义插件与中间件
│ │ └── resources
│ │ └── application.conf # Ktor 配置文件
│ └── test
│ └── kotlin
│ └── com.example.app # 测试代码
这种分层架构清晰分离关注点,既保证了模块之间的解耦,也方便扩展和测试。同时,可以根据实际需求再细化模块划分,确保代码复用与可维护性。📂
13. Ktor 服务的安全性设计
安全性是后端服务的重中之重。下面介绍几种常见的安全设计方案:
13.1. 认证与授权
Ktor 提供了多种认证方式,如 Basic、JWT、OAuth2 等。以 JWT 为例,配置示例如下:
object JwtConfig {private const val secret = "yourSecretKey"const val issuer = "ktor.io"const val audience = "ktor_audience"private const val validityInMs = 36_000_00 * 10 // 10 小时val verifier = JWT.require(Algorithm.HMAC256(secret)).withIssuer(issuer).withAudience(audience).build()fun generateToken(user: String): String = JWT.create().withSubject("Authentication").withIssuer(issuer).withAudience(audience).withClaim("username", user).withExpiresAt(Date(System.currentTimeMillis() + validityInMs)).sign(Algorithm.HMAC256(secret))
}
通过 JWT 进行认证,保证 API 只能被授权用户访问。
13.2. HTTPS 配置
在生产环境下,务必使用 HTTPS 加密传输。可通过反向代理(如 Nginx)或直接配置 Ktor 服务绑定 SSL 证书来实现。
13.3. 防御常见攻击
- 跨站请求伪造(CSRF):合理使用 CORS 策略。
- SQL 注入与 XSS 攻击:使用参数化查询以及对输入数据严格校验。
- 速率限制与熔断:对暴力请求或恶意攻击进行限流处理,保证服务稳定性。🔐
14. 本地开发环境与远程部署实践
一个完善的开发环境不仅能提升开发效率,还能大大降低维护成本。以下是一些建议:
14.1. 本地开发
- 使用 Docker:通过 Docker 镜像构建与部署本地开发环境,可避免“环境不一致”的问题。
- 热部署:启用自动重载机制(如 Gradle 的 continuous build 模式),提高开发调试效率。
- 日志与监控:本地集成 lightweight 的监控工具(如 Ktor 自带的 CallLogging),快速定位问题。
14.2. 远程部署
- Docker 化部署:构建 Dockerfile,将服务打包成镜像并部署到 Kubernetes、AWS ECS、阿里云等容器平台。
- CI/CD 流水线:配置 GitLab CI、Jenkins 等工具,自动化测试、构建与部署。
- 监控报警:接入 Prometheus、Grafana、Elasticsearch 等日志和监控工具,实时监控服务运行状态,及时响应异常。🚀
15. 实战案例——构建轻量级用户管理系统
以下是一个完整的实战案例,演示如何利用 Ktor 构建一个支持用户注册、登录和信息管理的后端服务。
15.1. 项目需求
- 用户注册:接收用户名、邮箱、密码等基本信息,并存储到数据库中。
- 用户登录:校验用户身份,返回 JWT Token。
- 用户信息管理:支持用户资料的查询与更新。
15.2. 数据模型设计
创建一个基本的用户数据模型:
@Serializable
data class User(val id: Int = 0,val name: String,val email: String,val password: String // 实际应用中请进行加密处理
)
15.3. 注册与登录逻辑
在 Controller 层中,实现用户注册与登录的逻辑:
routing {route("/users") {// 用户注册接口post("/register") {val user = call.receive<User>()// 模拟存储操作,并返回注册成功结果call.respond(HttpStatusCode.Created, "用户 ${user.name} 注册成功")}// 用户登录接口post("/login") {val credentials = call.receive<User>()// 简单模拟验证if (credentials.name == "admin" && credentials.password == "password") {val token = JwtConfig.generateToken(credentials.name)call.respond(HttpStatusCode.OK, mapOf("token" to token))} else {call.respond(HttpStatusCode.Unauthorized, "身份验证失败")}}}
}
15.4. 数据库集成
在实际项目中,你可以集成 Exposed、Hibernate 等 ORM 框架来操作数据库。这里以 Exposed 为例:
// 定义数据库表
object Users : Table() {val id = integer("id").autoIncrement()val name = varchar("name", 50)val email = varchar("email", 50)val password = varchar("password", 100)override val primaryKey = PrimaryKey(id)
}// 初始化数据库连接
fun initDB() {Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")transaction {SchemaUtils.create(Users)}
}
在注册或登录时,均可调用数据库操作相关代码进行数据持久化、验证以及查询操作。
16. 常见问题排查与调试技巧
在 Ktor 项目的实际开发中,经常会遇到各种问题。以下介绍几种常见问题的解决方案:
16.1. 断点调试和日志打印
利用 IDEA 自带调试工具,结合 CallLogging 插件记录日志,通过断点调试快速定位问题。
16.2. 网络请求调试
建议使用 Postman 或 Insomnia 进行接口测试,通过这些工具可以直观查看 API 返回值与状态码,便于与服务端代码比对。
16.3. 内存泄露与性能监控
- 使用 JVM 的内存分析工具(如 VisualVM)进行内存泄露检查;
- 配合 Prometheus 和 Grafana 实时监控 API 调用情况,及时调整线程池和协程调度。
16.4. 异常处理
全局安装 StatusPages 插件统一处理异常,并配置详细的错误日志输出,确保异常信息不会泄露至客户端,同时为开发者提供充足的调试线索。
17. 最佳实践建议
为了保证 Ktor 项目在生产环境中的高可用性和可维护性,以下是一些最佳实践:
- 模块化设计:将路由、业务逻辑、数据层等功能分离,保持代码清晰易维护。
- 充分利用协程:所有 I/O 操作均采用非阻塞协程,避免不必要的线程阻塞。
- 日志与监控:在每个关键环节添加日志记录,利用监控系统实时跟踪服务状态。
- 安全性优先:集成多重认证机制,尽量使用 HTTPS,防范常见 Web 攻击。
- 测试驱动开发:编写单元测试和集成测试,确保每次代码变更都能保持系统稳定。
- 文档与注释:详细记录每个模块的设计思路和调用方式,方便团队协作与后期维护。
- 持续集成与部署:借助 CI/CD 工具实现自动化测试、构建和部署,及时反馈问题。
18. 总结
本文详细讲解了使用 Ktor 构建现代 Android 应用后端服务的各个方面,从基础环境搭建、核心模块解析、异步编程优势,到安全性设计、性能调优以及从实战案例出发的端到端构建方案。我们见证了 Ktor 如何通过简单易用且高度可定制的特性,使得后端服务不仅性能卓越,更易于维护和扩展。🔥
相关文章:
使用 Ktor 构建现代 Android 应用的后端服务
使用 Ktor 构建现代 Android 应用的后端服务 前言 在移动互联网时代,Android 应用对后端服务的实时性与性能要求越来越高,而传统的后端框架在一些场景中存在复杂度高、扩展性不足等问题。Ktor 作为 JetBrains 推出的异步 Web 框架,充分利用…...
leetcode_454. 四数相加 II_java
454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/ 1、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] …...
类名与协议名相同,开发中应该避免吗?
在 Objective-C 开发中,协议与实现类之间的命名关系非常重要。虽然语言允许协议名和类名相同,但从可读性和维护性等角度出发,这种做法并不推荐。本文通过一个典型示例展开分析,并提供更合理的命名建议。 一、示例 在某项目中&…...
环信鸿蒙版 UIKit 快速上手指南
环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库,基于环信 IM SDK 开发,可帮助开发者快速集成即时通讯功能。 环信UIKit 的特点 ArkUI 声明式开发范式:采用高效简洁的声明式开发方式状态管理 V2:支持深度观测和精…...
编译freecad
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source 手动安装 vscode 扩展安装cmake tool cmake ../ 缺什么装什么 Third Party Libraries - FreeCAD Documentation sudo apt install qt6-base-dev sudo apt install libyaml-cpp-dev …...
安卓Kotlin接入高德定位和地图SDK
前言:高德的定位sdk可以获取设备当前的详细信息,如经纬度,具体地址(省->街道)等, 本文主要使用的是定位sdk和地图sdk中的poi搜索功能(以当前位置半径多少米内的关键词搜索) 目录…...
JavaScript浅拷贝与深拷贝
目录 浅拷贝(Shallow Copy) 一、浅拷贝的定义 二、直接赋值 vs 浅拷贝 1. 直接赋值 2. 浅拷贝 三、数组的浅拷贝方法 1. slice() 2. concat() 3. 扩展运算符(...) 四、对象的浅拷贝方法 1. Object.assign() 2. 扩展运…...
智能生态之城-广东茂名
故事摘要 在中国广东茂名的未来社区,晨光中,垂直果园里发光的荔枝与智能无人机的早餐派送唤醒了城市的生活。在海底透明隧道的图书馆里,孩子们通过声控设备与虚拟生物互动。面对暴雨来临时,市民们积极参与到荔枝蜜饯制作和雨季造林…...
【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总
在 Android 开发中,我们经常需要控制 Activity 的屏幕方向,例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示,并分析常见设置无效的原因与解决方法。 一、通过…...
Android 存储路径
一、内部存储路径(Internal Storage) stats.codeSize(内部代码大小) 路径:/data/app/com.example.test-{随机后缀}/base.apk 说明:APK 安装路径,包含应用代码…...
【12】数据结构之基于线性表的排序算法
目录标题 插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 归并排序时间复杂度对比最好情况平均情况最坏情况 空间复杂度对比 插入排序 基本思想:将一个元素插入到一个有序序列中,继而得到一个有序的元素个数加一的新序列. 直接插…...
解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题
要解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题,可以使用自定义的LinearSmoothScroller,使其底部对齐屏幕。步骤如下: 创建自定义的SmoothScroller类: 继承LinearSmoothScroller并重写getVerti…...
数字世界的免疫系统:恶意流量检测如何守护网络安全
在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...
十分钟机器学习之--------------线性回归
线性回归(linear regression)是一种基于数学模型的算法,首先假设数据集与标签之间存在线性关系,然后简历线性模型求解参数。在实际生活中,线性回归算法因为其简单容易计算,在统计学经济学等领域都有广泛的应…...
常用 Excel VBA 技巧,简单好学易上手
在日常办公中,我们常常会遇到各种繁琐的数据处理任务,而 Excel VBA(Visual Basic for Applications)作为一款强大的自动化工具,能够帮助我们轻松应对这些挑战。本文将介绍一些常用且简单好学的 Excel VBA 技巧…...
第7篇:Linux程序访问控制FPGA端LEDR<五>
Q:如何设计.c程序代码实现FPGA端外设LEDR流水灯? A:在DE1-SoC开发板上实现的流水灯效果:一次只点亮一个红色LED,初始状态为向左移动直至点亮LEDR9,然后改变移动的方向为向右直至点亮LEDR0,以此…...
PyTorch 深度学习实战(35):图生成模型与分子设计
在上一篇文章中,我们探讨了强化学习在机器人控制中的应用。本文将深入介绍图生成模型及其在分子设计领域的应用,这是一个结合深度学习与化学的交叉领域。我们将使用PyTorch Geometric实现基于图神经网络的分子生成模型,并在ZINC250k数据集上进…...
免费送源码:Java+ssm+HTML 三分糖——甜品店网站设计与实现 计算机毕业设计原创定制
录 摘要 1 1 绪论 3 1.1 研究背景 3 1.2 研究意义 3 1.3论文结构与章节安排 3 2系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1 登录流程 4 2.2.2数据删除流程 5 2.3 系统功能分析 5 2.3.1功能性分析 6 2.3.2 非功能性分析 7 2.4 系统用例分析 7 2.5本章…...
JVM 调试与内存优化实战详解
🌟 JVM 调试与内存优化实战详解 🌟 前言一、JVM 内存模型概览二、常见内存问题与诊断思路三、核心调试工具与命令详解四、实战案例一:频繁 Full GC 深度排查与优化1. 🕵️ 问题现象2. 🔬 排查流程3. ✅ 优化方案 五、实…...
Linux上通过Docker部署Zabbix6.2监控平台
文章目录 前言Zabbix概述zabbix特性 一、Zabbix架构二、主节点部署容器2.1 部署Docker 三、主节点部署数据库3.1 创建存储卷3.2 查看存储卷3.3 删除存储卷3.4 运行容器MySQL8 四、主节点部署Zabbix4.1 安装zabbix-java-gateway4.2 运行zabbix-server4.3 安装zabbix-web 五、配置…...
Grok3 API 已经免费开放了,附上免费使用 Grok3 API的教程
Grok-3是什么 Grok-3 是 xAI(由 Elon Musk 创立的 AI 公司)开发的最新大语言模型(LLM),属于 Grok 系列模型的第三代,旨在与 OpenAI 的 GPT-4、Anthropic 的 Claude 3 和 Google 的 Gemini 1.5 等顶尖 AI 竞…...
2025年4月9日-华为暑期实习-第三题-300分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 矩阵螺旋排序 问题描述 卢小姐是一家艺术展览馆的策展人,她正在为一个数字艺术展览设计一个特殊的展示方案。展览厅的墙面是一个 N N N \times N...
【Web API系列】WebSocketStream API 深度实践:构建高吞吐量实时应用的流式通信方案
前言 在当今的 Web 开发领域,实时通信已成为许多应用的核心需求。无论是即时聊天、实时数据仪表盘,还是在线游戏和金融交易系统,都需要高效的双向数据传输能力。传统的 WebSocket API 为此提供了基础支持,但在处理大规模数据流、…...
WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网不回显
目录 1. RCE执行-5大类函数调用 1.1 Runtime方式 1.2 Groovy执行命令 1.3 脚本引擎代码注入 1.4 ProcessImpl 1.5 ProcessBuilder 2. JNDI注入(RCE)-RMI&LDAP&高版本 2.1 RMI服务中的JNDI注入场景 2.2 LDAP服务中的JNDI注入场景 攻击路径示例&#…...
在android实现Google的web登录
前言 由于业务上的需要,想要在android端实现Google登录。但是android的原生方法受到限制,实现起来比较麻烦。于是想到了一个曲线救国的方法,在android端使用Google的web登录。 实现逻辑 在andorid端拉起外部浏览器,用户登录Google账号,登录成功后,再将登录信息返回到a…...
opencv常用边缘检测算子示例
opencv常用边缘检测算子示例 1. Canny算子2. Sobel算子3. Scharr算子4. Laplacian算子5. 对比 1. Canny算子 从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,检测算法可以分为以下5个步骤: 噪声过滤(高斯滤波&…...
安装了VM Tools,仍无法复制拖动-解决方案
今天在安装ubuntu时遇到了困扰许久的问题,安装了VM Tools,仍无法拖动主机文件到虚拟机,主要有两种原因并对应解决办法。 1.相关虚拟机设置选项卡中-客户机隔离-两个功能没有勾选 解决方案:勾选重启虚拟机即可 2.(这个…...
一文读懂WPF布局
WPF布局 布局WPF 布局的核心机制常用布局控件详解Grid(网格布局)StackPanel(堆叠布局)DockPanel(停靠布局)WrapPanel(自动换行布局)Canvas(绝对定位布局)Unif…...
【Docker基础-网络】--查阅笔记4
目录 Docker 网络网络类型none 网络host 网络bridge 网络自定义网络 容器间通信IP 通信Docker DNS Serverjoined 容器 容器与外部通信容器访问外部外部访问容器 Docker 网络 学习Docker提供的几种原生网络如何创建自定义网络容器间通信,容器于外界交互 Docker 安装…...
FacialExpressionDetection的conda虚拟环境搭建Window
安装conda的URL:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 清华源下载conda版本,哪个最新用哪个,这里下载Anaconda3-5.3.1-Windows-x86_64.exe版本 安装conda虚拟环境 conda create --name py1…...
IPD推进中关键角色与岗位(七)LTDT确保技术开发的实用性与可靠性,满足市场需求
IPD 体系作为一种先进的研发管理模式,其核心在于打破传统职能部门的壁垒,通过跨部门团队的协同合作,实现产品开发的全流程优化。在 IPD 体系的架构中,存在着多个关键团队,它们各司其职又紧密配合,共同推动产…...
c++自学笔记——字符串与指针
字符串与指针 1. 字符串基础 字符串的定义:字符的序列,通常用来表示文本。 字符串字面量(String Literal)是在程序中直接用双引号括起来的文本序列。字符串字面量的类型是 const char*,即指向字符常量的指针。字符串…...
Jmeter分布式测试启动
代理客户端配置 打开jmeter.properties文件,取消注释并设置端口(如server_port1099), 并添加server.rmi.ssl.disabletrue禁用SSL加密。 (Linux系统)修改jmeter-server文件中的RMI_HOST_DEF为代理机实际IP。…...
.DS_Store文件泄露、.git目录泄露、.svn目录泄露漏洞利用工具
🐉工具介绍 一款图形化的 .DS_Store文件泄露、.git目录泄露、.svn目录泄露漏洞利用工具。 🎯使用 本工具使用Python3 PyQt5开发,在开始使用前,请确保已经安装了相关模块: pip3 install -r requirements.txt -i ht…...
Coze+大模型智能体环境搭建
1 前言 Coze作为字节跳动推出的新一代AI Bot开发平台,为开发者提供了快速构建、部署智能对话代理的一站式解决方案。Coze平台通过提供可视化工作流编排、知识库集成、插件扩展等核心功能,结合一些大模型,例如豆包、deepseek、通义千问等大模型…...
计算机视觉与深度学习 | 视觉SLAM学习思路总结与视觉SLAM发展历程(1986年至2025年)
视觉SLAM(Simultaneous Localization and Mapping,同时定位与建图)是计算机视觉和机器人领域的重要研究方向,涉及数学、几何、优化、传感器融合等多学科知识。以下是学习视觉SLAM的系统化思路总结,适合从入门到进阶的学习路径:视觉SLAM学习思路总结 一、基础准备 数学基…...
Ansible(8)——循环与条件任务
目录 一、循环迭代任务: 1、简单循环: 2、循环字典列表: 3、Ansible 2.5 之前的循环关键字: 4、在循环中使用 register 变量: 二、条件任务: 1、使用条件句的常见场景: 2、条件任务语法…...
搭建Trae+Vue3的AI开发环境
从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲。 作为一个后端开发,这篇文章基于Trae工具,来创建和运行一个简单的Vue前端应用…...
【免费公测】可遇AI直播/无人直播/矩阵直播/AI场控
前言 经过了一个多月的内测打磨,实现了非常稳定的无人直播效果,AI直播语音及其真实,软件交互方便,可以快速的构建AI直播间。 免费公测,内置无限激活卡密一张,打开即用。 亮点 高仿真语音模型,…...
大数据Hadoop(MapReduce)
MapReduce概述 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上…...
使用apache-jmeter时,控制台打不开应用的解决方法
运行jmeter.bat的时候,提示: findstr 不是内部或外部命令,也不是可运行的程序 或批处理文件。 Not able to find Java executable or version. Please check your Java installation. errorlevel2这个错误信息表明系统无法识别 findstr 命令…...
leetcode 74. 搜索二维矩阵
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length;int n matrix[0].length;int l 0;int r n * m - 1; // 记得减一while (l < r) {int mid (l r) / 2;if(matrix[mid / n][mid % n] > target) {r mid - 1;} else if…...
函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?
大家好,我是你们的Java技术博主!今天我们要深入探讨Java函数式编程中的几个核心接口:Function、BiFunction和UnaryOperator。很多同学虽然知道它们的存在,但真正用起来却总是不得要领。这篇文章将带你彻底掌握它们!&am…...
SpringMVC基础一(SpringMVC运行原理)
先了解MVC,在JavaWeb基础五中。 回忆servlet,在javaweb基础二中。 创建一个web项目: 1、新建maven项目,导入依赖。(junit、springmvc、spring-webmvc、servlet-api、jsp-api、jstl) <groupId>org…...
libva之ffavdemo分析
ffavdemo 代码库实现了一个基于FFmpeg和VAAPI的硬件加速视频解码与渲染框架,主要用于演示视频解码与渲染的完整硬件加速流程。支持多种渲染后端(X11、DRM、EGL),适应不同显示环境。包含视频处理过滤器,可进行格式转换和…...
从零开始写android 的智能指针
Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),源码中的位置在system/core/include/utils/StrongPointer.h。另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强…...
Spark-SQL 之 Window
window 函数实例 select concat(substr(p_dt,1,4),substr(p_dt,6,2)...
Python设计模式-单例模式
一、单例模式核心思想 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。该模式主要解决以下问题: 资源控制(如数据库连接池)配置信息全局一…...
富文本编辑器的内容导出html,并保留图片
富文本编辑器的上传的图片默认转为base64,但是如果需要保存到数据库,base64的数据就太大了,所以一般都会长传到文件服务器,然会返回图片url。 但是当我们需要把富文本编辑器的内容导出为html时,因为图片时url,当浏览器…...
jQueryHTML与插件
1.jQuery 事件机制 1.1 注册事件 bind()、on()方法向被选元素添加一个或多个事件处理程序,以及当事件发生时运行的函数 $("p").on({"click": function () {alert("点击了")},"mouseenter": function () {…...