当前位置: 首页 > news >正文

[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)

[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)

在现代微服务架构中,经常需要在不同服务之间进行高效、可靠的通信。本文将介绍如何使用 Spring Boot 结合 Netty 实现一个 TCP 长连接客户端,并通过 RESTful 接口转发请求到后台 TCP 服务。这种架构在物联网、实时通信等领域非常常见。

一.架构设计

以下是系统的架构设计图:

RESTful
Response
Async
HTTP Client
Spring Boot Controller
Netty Client Service
TCP Connection Pool
Backend TCP Server
  • HTTP Client:外部客户端通过 RESTful 接口发送请求。
  • Spring Boot Controller:接收 HTTP 请求并转发到 Netty 客户端服务。
  • Netty Client Service:管理 TCP 长连接,发送请求并接收响应。
  • TCP Connection Pool:管理多个 TCP 连接,提高性能和可靠性。
  • Backend TCP Server:后台 TCP 服务,处理实际的业务逻辑。

二.项目搭建与依赖配置

1. 创建项目并添加依赖

创建一个 Spring Boot 项目,并添加以下依赖:

<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.94.Final</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

2. 配置参数

application.yml 文件中配置 TCP 服务器的地址、端口以及其他参数:

tcp:server:host: 127.0.0.1port: 9000client:worker-threads: 4connect-timeout: 3000heartbeat-interval: 30000max-frame-length: 65535

三.核心组件实现

3.1 Netty 客户端启动器

NettyClientBootstrap 负责初始化 Netty 客户端并建立长连接:

@Component
@Slf4j
public class NettyClientBootstrap {@Value("${tcp.server.host}")private String host;@Value("${tcp.server.port}")private int port;private volatile Channel channel;private Bootstrap bootstrap;@PostConstructpublic void init() throws InterruptedException {EventLoopGroup workerGroup = new NioEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(workerGroup).channel(NioSocketChannel.class).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();// 协议处理pipeline.addLast(new LengthFieldPrepender(4));pipeline.addLast(new LengthFieldBasedFrameDecoder(65535, 0, 4, 0, 4));pipeline.addLast(new StringEncoder(StandardCharsets.UTF_8));pipeline.addLast(new StringDecoder(StandardCharsets.UTF_8));// 业务处理器pipeline.addLast(new ClientHandler());}});connect();}private void connect() throws InterruptedException {ChannelFuture future = bootstrap.connect(host, port).sync();channel = future.channel();channel.closeFuture().addListener(f -> {log.warn("Connection lost, reconnecting...");reconnect();});}private void reconnect() {bootstrap.connect(host, port).addListener((ChannelFutureListener) future -> {if (future.isSuccess()) {channel = future.channel();log.info("Reconnected successfully");} else {log.error("Reconnect failed, retrying in 5s");channel.eventLoop().schedule(this::reconnect, 5, TimeUnit.SECONDS);}});}public Channel getChannel() {if (!channel.isActive()) {throw new IllegalStateException("Channel is inactive");}return channel;}
}

3.2 业务处理器

ClientHandler 负责处理 TCP 通信中的请求和响应:

@Slf4j
public class ClientHandler extends SimpleChannelInboundHandler<String> {private static final ConcurrentMap<String, CompletableFuture<String>> pendingRequests = new ConcurrentHashMap<>();@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {// 响应格式示例:REQ_ID|RESPONSE_DATAString[] parts = msg.split("\\|", 2);if (parts.length == 2) {CompletableFuture<String> future = pendingRequests.remove(parts[0]);if (future != null) {future.complete(parts[1]);}}}public static CompletableFuture<String> sendRequest(Channel channel, String message) {String reqId = UUID.randomUUID().toString();CompletableFuture<String> future = new CompletableFuture<>();pendingRequests.put(reqId, future);String protocolMsg = reqId + "|" + message;channel.writeAndFlush(protocolMsg).addListener(f -> {if (!f.isSuccess()) {future.completeExceptionally(f.cause());pendingRequests.remove(reqId);}});// 设置超时channel.eventLoop().schedule(() -> {if (pendingRequests.remove(reqId) != null) {future.completeExceptionally(new TimeoutException("Request timeout"));}}, 5, TimeUnit.SECONDS);return future;}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {log.error("Channel error", cause);ctx.close();}
}

3.3 服务层封装

TcpClientService 提供对外的服务接口,封装了 TCP 通信逻辑:

@Service
@RequiredArgsConstructor
public class TcpClientService {private final NettyClientBootstrap clientBootstrap;public String sendMessage(String message) throws Exception {Channel channel = clientBootstrap.getChannel();return ClientHandler.sendRequest(channel, message).get(5, TimeUnit.SECONDS);}
}

3.4 RESTful 接口层

TcpController 提供 RESTful 接口,接收外部请求并转发到 TCP 服务:

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class TcpController {private final TcpClientService tcpClientService;@PostMapping("/send")public ResponseEntity<?> sendCommand(@RequestBody String payload) {try {String response = tcpClientService.sendMessage(payload);return ResponseEntity.ok(response);} catch (TimeoutException e) {return ResponseEntity.status(HttpStatus.GATEWAY_TIMEOUT).body("Backend service timeout");} catch (Exception e) {return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body("Communication error: " + e.getMessage());}}
}

3.5 心跳保活机制

HeartbeatScheduler 定期发送心跳消息,保持 TCP 连接活跃:

@Component
@RequiredArgsConstructor
public class HeartbeatScheduler {private final TcpClientService tcpClientService;@Scheduled(fixedRateString = "${tcp.client.heartbeat-interval}")public void heartbeat() {try {tcpClientService.sendMessage("HEARTBEAT");} catch (Exception e) {log.error("Heartbeat failed", e);}}
}

四.关键功能说明

1. 长连接管理

  • 自动重连机制:断线后每 5 秒自动重试。
  • Channel 状态监控:实时监控连接状态,确保连接可用。
  • 异常自动恢复:捕获异常并尝试恢复连接。

2. 协议设计

协议格式如下:

+----------------+-------------------+
| 32字节UUID     | 实际消息内容(UTF8)|
+----------------+-------------------+

3. 异步处理流程

异步处理流程如下:

Controller Service Handler TCP Server 发送请求 生成请求ID 发送协议消息 返回响应 完成Future 返回响应 Controller Service Handler TCP Server

五.测试方法

1. 启动模拟 TCP 服务端

使用 Python 快速搭建一个测试 TCP 服务端:

# 使用Python快速搭建测试服务
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0', 9000))
sock.listen(1)while True:conn, addr = sock.accept()while True:data = conn.recv(1024)if not data: breakreq_id, payload = data.decode().split('|', 1)conn.send(f"{req_id}|ECHO:{payload}".encode())conn.close()

2. 发送测试请求

通过 curl 发送测试请求:

curl -X POST -H "Content-Type: text/plain" \
-d "Hello Netty" \
http://localhost:8080/api/send

六.生产级优化建议

1. 连接池扩展

实现多 Channel 管理,提高性能和可靠性:

public class ConnectionPool {private final BlockingQueue<Channel> pool = new LinkedBlockingQueue<>(10);public Channel getChannel() {Channel channel = pool.poll();if (channel == null || !channel.isActive()) {channel = createNewChannel();}return channel;}private Channel createNewChannel() {// 创建新连接逻辑}
}

2. 监控指标

添加监控指标,便于实时监控系统状态:

@Bean
public MeterRegistryCustomizer<MeterRegistry> metrics() {return registry -> {Gauge.builder("tcp.active.connections", () -> clientBootstrap.getActiveCount()).register(registry);};
}

3. SSL 加密支持

为 TCP 连接添加 SSL 加密支持:

bootstrap.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {SSLEngine engine = sslContext.newEngine(ch.alloc());pipeline.addLast(new SslHandler(engine));// 其他处理器...}
});

4. 流量控制

添加流量控制机制,防止服务过载:

// 在Handler中添加限流器
private final RateLimiter rateLimiter = RateLimiter.create(1000); // QPS=1000public static CompletableFuture<String> sendRequest(...) {if (!rateLimiter.tryAcquire()) {throw new RateLimitExceededException();}// 原有逻辑...
}

总结

本文介绍了一个基于 Spring Boot 和 Netty 的 TCP 长连接客户端实现方案,支持通过 RESTful 接口转发请求到后台 TCP 服务。该方案具备以下核心功能:

  • 基于 Netty 的 TCP 长连接管理
  • 异步请求/响应匹配机制
  • 自动重连和心跳保活
  • RESTful 接口集成
  • 完善的超时和异常处理

你可以根据实际需求调整协议格式、连接池参数和安全策略。建议配合 APM 工具(如 SkyWalking)进行链路监控,以进一步优化系统性能和稳定性。

希望本文对你有所帮助!如果有任何问题或建议,欢迎在评论区留言。

相关文章:

[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)

[Java实战]Spring Boot Netty 实现 TCP 长连接客户端及 RESTful 请求转发&#xff08;二十六&#xff09; 在现代微服务架构中&#xff0c;经常需要在不同服务之间进行高效、可靠的通信。本文将介绍如何使用 Spring Boot 结合 Netty 实现一个 TCP 长连接客户端&#xff0c;并…...

ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例

ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例 在当今数字化工业时代&#xff0c;智能仪表与控制系统的互联互通成为提高生产效率和管理水平的关键。横河AXG电磁流量计作为一款高性能的流量测量设备&#xff0c;在多个行业得到了广泛应用。而Profibus DP作为一种…...

鸿蒙OSUniApp开发的商品详情展示页面(鸿蒙系统适配版)#三方框架 #Uniapp

使用UniApp开发的商品详情展示页面&#xff08;鸿蒙系统适配版&#xff09; 前言 随着移动电商的普及&#xff0c;一个体验良好的商品详情页对于提高用户转化率至关重要。本文将分享我在使用UniApp开发商品详情页时的实践经验&#xff0c;并特别关注如何适配鸿蒙系统&#xf…...

VMware中快速安装与优化Ubuntu全攻略

准备工作 在开始安装之前&#xff0c;确保已经下载了VMware Workstation或VMware Player&#xff0c;并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件&#xff0c;支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...

本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 【单机】超时问题解决

现状&#xff1a;本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 超时 一、确认kafka是否在9092端口上运行 netstat -tulnp | grep 9092输出 tcp6 0 0 :::9092 :::* LISTEN 66113/java 使用jps查看进程66113的详细信息…...

CSS AI 通义灵码 VSCode插件安装与功能详解

简介 在前端开发领域&#xff0c;页面调试一直是个繁琐的过程&#xff0c;而传统开发中美工与前端的对接也常常出现问题。如今&#xff0c;阿里云技术团队推出的通义灵码智能编码助手&#xff0c;为前端开发者带来了新的解决方案&#xff0c;让开发者可以像指挥者一样&#xf…...

MUSE Pi Pro 使用TiTanTools烧录镜像

视频讲解&#xff1a; MUSE Pi Pro 使用TiTanTools烧录镜像 下载windows下的烧录工具 https://cloud.spacemit.com/prod-api/release/download/tools?tokentitantools_for_windows_X86_X64 下载镜像文件&#xff0c;zip后缀的即可 打开软件默认界面 按住FDL键&#xff0c;同时…...

嵌软面试每日一阅----通信协议篇(二)之TCP

一. TCP和UDP的区别 可靠性 TCP&#xff1a;✅ 可靠传输&#xff08;三次握手 重传机制&#xff09; UDP&#xff1a;❌ 不可靠&#xff08;可能丢包&#xff09; 连接方式 TCP&#xff1a;面向连接&#xff08;需建立/断开连接&#xff09; UDP&#xff1a;无连接&#xff0…...

开机自启动python程序_ubuntu22.04

一、没有设置开机自启动时 1、 conda activate yolo cd /home/orangepi/work_11.15/zipformer 2、 python app.py 二、设置开机自启动流程 1、新建一个文件.service文件 touch zipformer.service 2、最重要的找到你自己的环境路径 这个是我的 yolo的虚拟环境在&#xff…...

8、SpringBoot集成MinIO

8、SpringBoot集成MinIO https://xiaoxueblog.com/ai/SpringBoot%E9%9B%86%E6%88%90MinIO.html 1、pom <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.12</version> </dependency>2…...

LeRobot 框架的核心架构概念和组件(下)

本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统&#xff0c;并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 机器人控制系统 机器人控制系统提供统一的接口来控制实体机器人。它支持不同的控制模式和机器人类型&#xff0c…...

ubuntu18 设置静态ip

百度 编辑/etc/netplan/01-netcfg.yaml 系统没有就自己编写 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 设置你的IP地址和子网掩码 gateway4: 192.168.20.1 # 网关地址 namese…...

QML元素 - ThresholdMask

QML 的 ThresholdMask 用于根据阈值将源元素与遮罩元素的像素值进行比较&#xff0c;通过设定阈值范围来控制源元素的可见区域。它适用于基于亮度、透明度或颜色通道的动态遮罩效果&#xff0c;例如游戏中的血条、进度指示器或图像处理中的抠图。以下是详细使用技巧和场景示例&…...

[项目深挖]仿muduo库的并发服务器的解析与优化方案

标题&#xff1a;[项目深挖]仿muduo库的并发服务器的优化方案 水墨不写bug 文章目录 一、buffer 模块&#xff08;1&#xff09;线性缓冲区直接扩容---->环形缓冲区定时扩容&#xff08;只会扩容一次&#xff09;&#xff08;2&#xff09;使用双缓冲&#xff08;Double Buf…...

(独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??

背景&#xff1a; 在销售发票生成的凭证中&#xff0c;控制凭证有两个字段&#xff1a;对象类型、对应编码&#xff1b;那这个PSG到底是什么东东&#xff1f;网上一直没人解释&#xff0c;可能没人研究过这个问题。 官方解释&#xff1a; 按我的理解&#xff0c;PSG profile …...

流程编辑器Bpmn与LogicFlow学习

工作流技术如何与用户交互结合&#xff08;如动态表单、任务分配&#xff09;处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式&#xff08;如修改节点颜色、形状、图标&#xff09;扩展过上下文菜单&#xff08;Palette&#xff09;或属性面板&#xff08;Properties Panel&…...

群晖NAS部署PlaylistDL音乐下载器结合cpolar搭建私有云音乐库

文章目录 前言1.关于PlaylistDL音乐下载器2.Docker部署3.PlaylistDL简单使用4.群晖安装Cpolar工具5.创建PlaylistDL音乐下载器的公网地址6.配置固定公网地址总结 前言 各位小伙伴们&#xff0c;你们是不是经常为了听几首歌而开通各种平台的VIP&#xff1f;或者为了下载无损音质…...

Unity光照笔记

问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题&#xff0c;不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章&#xff1a…...

【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for

1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定义,没有实现,在执行ROS2 colc…...

deepseek讲解如何快速解决内存泄露,内存溢出问题

Java内存泄漏与内存溢出解决方案及预防措施 作为Java架构师&#xff0c;处理内存泄漏和内存溢出问题需要系统性的方法。以下是一份完整的解决方案和预防建议&#xff1a; 一、问题诊断阶段 1. 确认内存泄漏现象 监控GC日志&#xff0c;观察老年代使用率是否持续增长使用jst…...

双系统重装ubuntu

双系统ubuntu20.04重装&#xff08;详细版&#xff09;_ubuntu20.04安装教程-CSDN博客...

图形语言中间层:重构 AI 编程的未来之路

在软件开发的历史长河中&#xff0c;每一次技术革新都伴随着对效率与可控性的重新定义。当 ChatGPT、GitHub Copilot 等 AI 工具以自然语言生成代码的惊艳表现叩响编程世界的大门时&#xff0c;人们曾满怀憧憬地期待一个 “无代码” 的黄金时代 —— 只需用日常语言描述需求&am…...

Ubuntu操作合集

UFWUncomplicated Firewall 查看状态和规则&#xff1a; 1查看状态sudo ufw status&#xff0c; 2查看详细信息sudo ufw status verbose&#xff0c; 默认策略配置&#xff1a; 1拒绝所有入站sudo ufw default deny incoming 2允许所有出战sudo ufw default allow outgoing …...

张量与Python标量:核心区别与计算图断开解析

张量与Python标量的核心区别 张量(Tensor) 是PyTorch中的核心数据结构,类似于多维数组: 支持GPU加速计算跟踪计算历史(用于自动求导)可以包含多个元素Python标量(int/float) 是普通的Python数值类型: 不支持GPU加速没有计算历史记录单个独立数值计算图断开的原因 Py…...

U9C与钉钉审批流对接完整过程

U9C 功能强大&#xff0c;然而在移动办公和审批流方面存在一定不足。为了弥补这一缺陷&#xff0c;不少企业在使用 U9C 的同时&#xff0c;会选择开通钉钉这类 OA 管理系统。不过&#xff0c;两套系统并行使用时&#xff0c;数据同步问题便随之而来。目前&#xff0c;常见的做法…...

双重差分模型学习笔记4(理论)

【DID最全总结】90分钟带你速通双重差分&#xff01;_哔哩哔哩_bilibili 目录 总结&#xff1a;双重差分法&#xff08;DID&#xff09;在社会科学中的应用&#xff1a;理论、发展与前沿分析 一、DID的基本原理与核心思想 二、经典DID&#xff1a;标准模型与应用案例 三、…...

【Pandas】pandas DataFrame diff

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

什么是Agentic AI(代理型人工智能)?

什么是Agentic AI&#xff08;代理型人工智能&#xff09;&#xff1f; 一、概述 Agentic AI&#xff08;代理型人工智能&#xff09;是一类具备自主决策、目标导向性与持续行动能力的人工智能系统。与传统AI系统依赖外部输入和显式命令不同&#xff0c;Agentic AI在设定目标…...

记录算法笔记(2025.5.15)二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…...

2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…...

2021-10-25 C++三的倍数含五

缘由含数字五且是三的倍数-编程语言-CSDN问答 void 三的倍数含五() {//缘由https://ask.csdn.net/questions/7544132?spm1005.2025.3001.5141int a 3, aa a;while (a < 10000){if (aa)if (aa % 10 5)std::cout << a << std::ends, aa a 3; else aa / 10;…...

编程日志5.8

二叉树练习题 1.965. 单值二叉树 - 力扣(LeetCode) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) :…...

Vue.js---避免无限递归循环 调度执行

4.4 避免无限递归循环 什么情况下会无限递归&#xff1f; 01 const data { foo: 1 } 02 const obj new Proxy(data, { /*...*/ }) 03 04 effect(() > obj.foo)例如这种情况&#xff0c;它会反复设置添加一直到栈溢出 首先读取obj.foo 的值&#xff0c;这会触发 track 操…...

AI大模型学习二十四、实践QEMU-KVM 虚拟化:ubuntu server 25.04 下云镜像创建Ubuntu 虚拟机

一、说明 虽然说大部分的场合&#xff0c;docker都能解决问题&#xff0c;但是有些大型的软件安装时如果修改配置会很麻烦&#xff0c;比方说前面遇到的code-server和dify 默认都是80和443端口要使用&#xff0c;安装在一起就会端口冲突&#xff0c;通过该端口来解决问题&#…...

Lovart:首个AI设计智能体

今天介绍一款AI设计智能体——Lovart&#xff0c;能调用各种绘画API和视频API&#xff0c;也能调用LibLib上的Flux和LoRA&#xff0c;并且智能体的编排效果确实很好&#xff0c;产出效果比豆包和ChatGPT都好&#xff0c;可以说没有竞品。视频为效果演示&#xff0c;官网有更多案…...

Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验

在软件开发领域&#xff0c;效率与创新始终是开发者追求的核心目标。Trae 插件&#xff08;原 MarsCode 编程助手&#xff09;Builder 模式的全面上线&#xff0c;无疑为开发者带来了全新的解决方案。它不仅同时支持 VS Code、JetBrains IDEs 等主流开发环境&#xff0c;还能让…...

解决ubuntu20中tracker占用过多cpu,引起的风扇狂转

track是linux中的文件索引工具&#xff0c;ubuntu18之前是默认不安装的&#xff0c;所以在升级到20后会默认安装&#xff0c;它是和桌面程序gnome绑定的&#xff0c;甚至还有很多依赖项&#xff0c;导致无法删除&#xff0c;一旦删除很多依赖项都不能运行&#xff0c;禁用也很难…...

解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则

RNA翻译是基因表达的核心环节&#xff0c;其精确调控依赖于翻译起始位点&#xff08;TIS&#xff09;和终止位点&#xff08;TTS&#xff09;的准确识别。传统方法依赖于简单的经验规则&#xff08;如Kozak序列或最长开放阅读框ORF&#xff09;&#xff0c;但忽略了RNA结构、顺…...

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速 2025/5/15 14:47 缘起&#xff1a;让飞凌的OK3588-C的核心板在Linux R4下&#xff0c;想看看以太网RTL8211F-CG的极速。 于是在飞凌的OK3588-C的核心板上&#xff0c;iperf3的收发一起跑…...

在Linux内安装虚拟机安装vmnet.tar 报错

编译报错如下: /usr/lib/vmware/modules/source/vmnet-only/userif.c: 在函数‘VNetCsumCopyDatagram’中: /usr/lib/vmware/modules/source/vmnet-only/userif.c:88:39: 错误&#xff1a;‘skb_frag_t {或称 const struct bio_vec}’ has no member named ‘page_offset’; di…...

CodeBuddy编程新范式

不会写&#xff1f;不想写&#xff1f; 腾讯推出的CodeBuddy彻底解放双手。 示例 以下是我对CodeBuddy的一个小体验。 我只用一行文字对CodeBuddy说明了一下我的需求&#xff0c;剩下的全部就交给了CodeBuddy&#xff0c;我需要做的就是验收结果即可。 1.首先CodeBuddy会对任…...

ESP32简介及相关使用

乐鑫官网&#xff1a; 无线通信 SoC、软件、云和 AIoT 方案&#xff5c;乐鑫科技 (espressif.com) 简介 ESP32 是由 乐鑫科技&#xff08;Espressif Systems&#xff09; 推出的一款高性能、低功耗的 Wi-Fi & 蓝牙双模物联网&#xff08;IoT&#xff09;芯片&#xff0c;广…...

全志F10c200开发笔记——移植uboot

相关资料&#xff1a; &#xff08;二&#xff09;uboot移植--从零开始自制linux掌上电脑&#xff08;F1C200S)&#xff1c;嵌入式项目&#xff1e;-CSDN博客 F1C200S挖坑日记&#xff08;3&#xff09;——Uboot编译篇_f1c200s uboot-CSDN博客 一、安装编译器 Linaro Rele…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus解密

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs- Manus解密 那你当前这个步骤执行完成之后&#xff0c;这边说了一个非常重要的点&#xff1f;每次迭代只选择一个工具&#xff0c;这个可能对大家感觉有点反直觉&#xff0c;可能大家立即选择分…...

理解c++中关键字友元friend的作用

理解c中关键字友元friend的作用 friend 关键字在 C 中用于声明一个函数或类为另一个类的友元。 友元函数或友元类可以访问该类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。 友元函数 作用&#xff1a; 允许非成员函数访问私有成员&…...

【学习心得】2025年Docker Desktop安装记录

1、docker的官方网站&#xff0c;已进入就可以看到下载按钮&#xff0c;无脑点击下载&#xff01;英特尔的CPU所以选择AMD64 2、双击安装&#xff0c;默认的勾选不用改 Docker Desktop 4.40.0安装过程中的配置选项窗口 Use WSL 2 instead of Hyper-V (recommended)&#xff08…...

数据结构——例题2

1.在线性表中&#xff0c;除了开始元素外&#xff0c;每个元素&#xff08;A&#xff09; A.只有唯一的前驱元素 B.只有唯一的后继元素 C.有多个前驱元素 D.有多个后继元素 2.在一个长度为n的顺序表中删除第i个元素&#xff08;1<i<n&#xff09;时&#xff0c;需向前…...

python开发api平台雏形

api平台雏形 一、Django基本配置 1.1使用pycherm创建项目 1.2 运行项目 1.3 创建app python.exe .\manage.py startapp cmdb1.4 settings.py添加app 1.5 settings.py设置数据库 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: devopsapi,USER: root,PASSWO…...

Android Development Roadmap

&#x1f527; Android Development Roadmap (Practical First → Theory Later) Here’s a lean, real-world roadmap tailored to the mindset — build-first, theory-when-needed: &#x1f7e2; Stage 1: Core Setup & Workflow (Done ✅) ✅ Install Android Studio…...

将.pt文件执行图像比对

目录 1. 加载模型 2. 图像预处理 3. 提取图像特征 4. 计算相似度 调用API或封装函数即可实现端到端比对 使用.pt文件进行图像比对通常涉及以下步骤&#xff1a; 1. 加载模型 python import torch# 假设模型是PyTorch保存的权重文件 model YourModelClass() # 需与保存时…...