netty构建udp服务器以及发送报文到客户端客户端详细案例
目录
一、基于netty创建udp服务端以及对应通道设置关键
二、发送数据
三、netty中的ChannelOption常用参数说明
1、ChannelOption.SO_BACKLOG
2、ChannelOption.SO_REUSEADDR
3、ChannelOption.SO_KEEPALIVE
4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF
5、ChannelOption.SO_LINGER
6、ChannelOption.TCP_NODELAY
一、基于netty创建udp服务端以及对应通道设置关键
@Configuration
@RefreshScope
public class NettyUdpServer {@Value("${netty.server.udpPort}")private int port;private EventLoopGroup bossGroup;//主线程private Channel channel;//通道private ChannelFuture future; //回调@Autowiredprivate DataCollector dataCollector;;public Channel start() throws InterruptedException {//判断是否支持Epoll模式,从而创建不同的线程组bossGroup = Epoll.isAvailable()? new EpollEventLoopGroup() : new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();//linux平台下增加SO_REUSEPORT特性提高性能,支持多个进程或者线程绑定到同一个端口,提高服务器程序的吞吐性能if(Epoll.isAvailable()) {//设置反应器线程组b.group(bossGroup).handler(new EpollUdpServerInitializer(dataCollector))//设置nio类型的通道.channel(EpollDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).option(ChannelOption.SO_REUSEADDR, true).option(ChannelOption.SO_RCVBUF, 1024 * 1024).option(EpollChannelOption.SO_REUSEPORT, true);}else{//设置反应器线程组b.group(bossGroup).handler(new UdpServerInitializer(dataCollector))//设置nio类型的通道.channel(NioDatagramChannel.class)//设置通道的参数.option(ChannelOption.SO_BROADCAST, true).option(ChannelOption.SO_REUSEADDR, true);}//Channel channel = server.bind(port).sync().channel();//开始绑定服务器,通过调用sync()同步方法阻塞直到绑定成功//ChannelFuture channelFuture = b.bind(port).sync();//等待通道关闭的异步任务结束//ChannelFuture closeFuture = channelFuture.channel().closeFuture();//closeFuture.sync();ChannelFuture f = b.bind(port).sync();channel = f.channel();if(f.isSuccess()){//MasterSelector registry = new MasterSelector("","netty-services", port);System.out.println("UDP服务器启动,监听在端口:" + port);}else {channel.closeFuture().sync();}} finally {//bossGroup.shutdownGracefully().sync();}System.out.println("Udp服务器启动,监听在端口:"+port);return channel;}
}
以上代码中Epoll.isAvailable()用户判断是window还是linux环境,linux环境默认采用Epoll相关通道,所以显式设置EpollDatagramChannel通道。在处理(handler)的设置中要根据不同的通道设置初始化的通道类型:
linux环境下EpollDatagramChannel通道设置 .handler(new EpollUdpServerInitializer(dataCollector))具体代码
public class EpollUdpServerInitializer extends ChannelInitializer<EpollDatagramChannel> {private final DataCollector dataCollector;public EpollUdpServerInitializer(DataCollector dataCollector) {this.dataCollector = dataCollector;}@Overrideprotected void initChannel(EpollDatagramChannel epollDatagramChannel) throws Exception {epollDatagramChannel.pipeline()//添加netty空闲超时检查的支持.addLast(new UdpServerHandler(dataCollector));}
要使 通过服务器端通过EpollDatagramChannel通道发送数据,客户端能够正常接收到数据,下图中标红的泛型通道类要与服务器端设置的通道类一致

同意要支持Nio类型通道为NioDatagramChannel.class时,通道初始化为:
public class UdpServerInitializer extends ChannelInitializer<NioDatagramChannel> {private final DataCollector dataCollector;public UdpServerInitializer(DataCollector dataCollector) {this.dataCollector = dataCollector;}@Overrideprotected void initChannel(NioDatagramChannel nioDatagramChannel) throws Exception {nioDatagramChannel.pipeline()//添加netty空闲超时检查的支持.addLast(new UdpServerHandler(dataCollector));}
}
要使 通过服务器端通过NioDatagramChannel通道发送数据,客户端能够正常接收到数据,下图中标红的泛型通道类要与服务器端设置的通道类一致
二、发送数据
关键代码,采用writeAndFlush发送数据,注意:要发送udp数据报,
public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {/**设置最大消息大小*/private static final int MAX_MESSAGE_SIZE = 2048;/**线程池*/private ExecutorService executorService;private final DataCollector dataCollector;public UdpServerHandler(DataCollector dataCollector) {this.dataCollector = dataCollector;//根据当前系统可用的处理器数量创建一个固定长度的线程池executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket datagramPacket) throws Exception {ByteBuf buffer = datagramPacket.content();//确保不会超出最大消息大小if(buffer.readableBytes() > MAX_MESSAGE_SIZE) {buffer.release();return;}UdpDatagram udpDatagram = parseUdpDatagram(buffer);UdpDatagram respUdpDatagram = dataCollector.processUdpDatagram(udpDatagram);if (null != respUdpDatagram) {handleReceivedData(ctx, respUdpDatagram, datagramPacket);}}/*** 处理接收到的数据* @param ctx* @param udpDatagram*/public void handleReceivedData(ChannelHandlerContext ctx, UdpDatagram udpDatagram, DatagramPacket datagramPacket) throws ExecutionException, InterruptedException {Channel channel = ctx.channel();if (log.isInfoEnabled()) {log.info("received udp message: sessionId: {}, opCode: {}, short messageId: {}",ctx.channel().id(), udpDatagram.getMessageTypeEnum(), udpDatagram.getShortMessageId());}byte[] payloadBytes = udpDatagram.getPayloadBytes();ByteBuf copiedBuffer = Unpooled.copiedBuffer(payloadBytes);ChannelFuture channelFuture = channel.writeAndFlush(new DatagramPacket(copiedBuffer.retain(), datagramPacket.sender()));channelFuture.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture channelFuture) throws Exception {if (channelFuture.isSuccess()) {// 数据发送成功log.info("数据发送成功:sender host: {}, sender port:{}, sender address:{}",datagramPacket.sender().getHostName(),datagramPacket.sender().getPort(), datagramPacket.sender().getAddress());} else {// 数据发送失败log.error("数据发送失败: {}",channelFuture.cause().getStackTrace());channelFuture.cause().printStackTrace();}}});}@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {dataCollector.tcpConnect(ctx.channel());}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {if (log.isWarnEnabled()) {log.warn("udp session throw an exception, sessionId:{} exception message: {}",ctx.channel().id().asLongText(), cause.getMessage());}}//当客户端关闭链接时关闭通道@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {dataCollector.tcpChannelDisconnect(ctx.channel());}
}
处理类继承SimpleChannelInboundHandler类泛型类为DatagramPacket
writeAndFlush方法中发送的数据类型要是DatagramPacket

三、netty中的ChannelOption常用参数说明
1、ChannelOption.SO_BACKLOG
ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数。函数listen(int socketfd, int backlog)用来初始化服务端可连接队列。
服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小。
2、ChannelOption.SO_REUSEADDR
ChanneOption.SO_REUSEADDR对应于套接字选项中的SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口。
比如,某个服务器进程占用了TCP的80端口进行监听,此时再次监听该端口就会返回错误,使用该参数就可以解决问题,该参数允许共用该端口,这个在服务器程序中比较常使用。
比如某个进程非正常退出,该程序占用的端口可能要被占用一段时间才能允许其他进程使用,而且程序死掉以后,内核一需要一定的时间才能够释放此端口,不设置SO_REUSEADDR就无法正常使用该端口。
3、ChannelOption.SO_KEEPALIVE
Channeloption.SO_KEEPALIVE参数对应于套接字选项中的SO_KEEPALIVE,该参数用于设置TCP连接,当设置该选项以后,连接会测试链接的状态,这个选项用于可能长时间没有数据交流的连接。
当设置该选项以后,如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文。
4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF
ChannelOption.SO_SNDBUF参数对应于套接字选项中的SO_SNDBUF,ChannelOption.SO_RCVBUF参数对应于套接字选项中的SO_RCVBUF这两个参数用于操作发送缓冲区大小和接受缓冲区大小。
接收缓冲区用于保存网络协议站内收到的数据,直到应用程序读取成功,发送缓冲区用于保存发送数据,直到发送成功。
5、ChannelOption.SO_LINGER
ChannelOption.SO_LINGER参数对应于套接字选项中的SO_LINGER,Linux内核默认的处理方式是当用户调用close()方法的时候,函数返回,在可能的情况下,尽量发送数据,不一定保证会发送剩余的数据,造成了数据的不确定性,使用SO_LINGER可以阻塞close()的调用时间,直到数据完全发送。
6、ChannelOption.TCP_NODELAY
ChannelOption.TCP_NODELAY参数对应于套接字选项中的TCP_NODELAY,该参数的使用与Nagle算法有关。
Nagle算法是将小的数据包组装为更大的帧然后进行发送,而不是输入一次发送一次,因此在数据包不足的时候会等待其他数据的到来,组装成大的数据包进行发送,虽然该算法有效提高了网络的有效负载,但是却造成了延时。
而该参数的作用就是禁止使用Nagle算法,使用于小数据即时传输。和TCP_NODELAY相对应的是TCP_CORK,该选项是需要等到发送的数据量最大的时候,一次性发送数据,适用于文件传输。
| SO_BROADCAST | 对应套接字层的套接字:SO_BROADCAST,将消息发送到广播地址。 如果目标中指定的接口支持广播数据包,则启用此选项可让应用程序发送广播消息。 |
| SO_KEEPALIVE | 对应套接字层的套接字:SO_KEEPALIVE,保持连接。 在空闲套接字上发送探测,以验证套接字是否仍处于活动状态。 |
| SO_SNDBUF | 对应套接字层的套接字:SO_SNDBUF,设置发送缓冲区的大小。 |
| SO_RCVBUF | 对应套接字层的套接字:SO_RCVBUF,获取接收缓冲区的大小。 |
| SO_REUSEADDR | 对应套接字层的套接字:SO_REUSEADDR,本地地址复用。 启用此选项允许绑定已使用的本地地址。 |
| SO_LINGER | 对应套接字层的套接字:SO_LINGER,延迟关闭连接。 启用此选项,在调用close时如果存在未发送的数据时,在close期间将阻止调用应用程序,直到数据被传输或连接超时。 |
| SO_BACKLOG | 对应TCP/IP协议中<font color=red>backlog</font>参数,<font color=red>backlog</font>即连接队列,设置TCP中的连接队列大小。如果队列满了,会发送一个ECONNREFUSED错误信息给C端,即“ Connection refused”。 |
| SO_TIMEOUT | 等待客户连接的超时时间。 |
| IP_TOS | 对应套接字层的套接字:IP_TOS,在IP标头中设置服务类型(TOS)和优先级。 |
| IP_MULTICAST_ADDR | 对应IP层的套接字选项:IP_MULTICAST_IF,设置应发送多播数据报的传出接口。 |
| IP_MULTICAST_IF | 对应IP层的套接字选项:IP_MULTICAST_IF2,设置应发送多播数据报的IPV6传出接口。 |
| IP_MULTICAST_TTL | 对应IP层的套接字选项:IP_MULTICAST_TTL,在传出的 多播数据报的IP头中设置生存时间(TTL)。 |
| IP_MULTICAST_LOOP_DISABLED | 取消 指定应将 传出的多播数据报的副本 回传到发送主机,只要它是多播组的成员即可。 |
| TCP_NODELAY | 对应TCP层的套接字选项:TCP_NODELAY,指定TCP是否遵循<font color=#35b998>Nagle算法</font> 决定何时发送数据。Nagle算法代表通过减少必须发送包的个数来增加网络软件系统的效率。即尽可能发送大块数据避免网络中充斥着大量的小数据块。如果要追求高实时性,需要设置关闭Nagle算法;如果需要追求减少网络交互次数,则设置开启Nagle算法。 |
ChannelOption通用配置
| 参数 | 说明 |
| ALLOCATOR | ByteBuf的分配器,默认值为ByteBufAllocator.DEFAULT。 |
| RCVBUF_ALLOCATOR | 用于Channel分配接受Buffer的分配器,默认值为AdaptiveRecvByteBufAllocator.DEFAULT,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。可选值为FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器。 |
| MESSAGE_SIZE_ESTIMATOR | 消息大小估算器,默认为DefaultMessageSizeEstimator.DEFAULT。估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位。 |
| CONNECT_TIMEOUT_MILLIS | 连接超时毫秒数,默认值30000毫秒即30秒。 |
| WRITE_SPIN_COUNT | 一个Loop写操作执行的最大次数,默认值为16。也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。 |
| WRITE_BUFFER_WATER_MARK | |
| ALLOW_HALF_CLOSURE | 一个连接的远端关闭时本地端是否关闭,默认值为False。值为False时,连接自动关闭;为True时,触发ChannelInboundHandler的userEventTriggered()方法,事件为ChannelInputShutdownEvent。 |
| AUTO_READ | 自动读取,默认值为True。Netty只在必要的时候才设置关心相应的I/O事件。对于读操作,需要调用channel.read()设置关心的I/O事件为OP_READ,这样若有数据到达才能读取以供用户处理。该值为True时,每次读操作完毕后会自动调用channel.read(),从而有数据到达便能读取;否则,需要用户手动调用channel.read()。需要注意的是:当调用config.setAutoRead(boolean)方法时,如果状态由false变为true,将会调用channel.read()方法读取数据;由true变为false,将调用config.autoReadCleared()方法终止数据读取。 |
相关文章:
netty构建udp服务器以及发送报文到客户端客户端详细案例
目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、Ch…...
Selenium 学习(0.22)——软件测试之小结
Junit 等一系列自动化工具不用啰嗦了,自己就是小白再搞科普就装了。 把后面相关内容看了一下,使用这些测试工具一样编写代码(驱动模块【调用接口的代码片段】,桩模块【响应输出结果的代码片段,也就是被测模块调用的模块…...
贪心算法问题
分发饼干-455 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有…...
深入理解 @Transactional 注解在 Spring 中的应用
前言:在 Java 开发中,事务管理是非常重要的一环。Spring 框架提供了Transactional注解来简化事务管理的操作,本文将深入介绍Transactional注解的用法,并结合代码示例进行详细讨论。 1.Transactional 注解简介 Transactional注解是…...
Python爬虫之爬取网页图片
当我们想要下载网页的图片时,发现网页的图片太多了,无从下手,那我们写一个脚本来爬取呗。 这次的脚本是专门针对某个外国网站使用的,因此仅供参考思路。 在测试的过程中,我发现网站使用了发爬虫机制,具体就…...
AI Agent(LLM Agent)入门解读
1. 什么是AI Agent? AI Agent可以理解为一个智能体,包括感知模块、规划决策模块和行动模块,类似于人类的五官、大脑和肢体。它能帮助人类处理复杂的任务,并能根据环境反馈进行学习和调整。 五官可以理解为感知模块,大…...
自动化面试常见算法题!
1、实现一个数字的反转,比如输入12345,输出54321 num 12345 num_str str(num) reversed_num_str num_str[::-1] reversed_num int(reversed_num_str) print(reversed_num) # 输出 54321代码解析:首先将输入的数字转换为字符串ÿ…...
CCF-CSP真题202206-2《寻宝!大冒险!》
题目背景 暑假要到了。可惜由于种种原因,小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到…… 某天,小 P 获得了一张神秘的藏宝图。 问题描述 西西艾弗岛上种有 n 棵树,这些树的具体位置记录在…...
Rust编程(三)生命周期与异常处理
生命周期 生命周期,简而言之就是引用的有效作用域。在大多数时候,我们无需手动的声明生命周期,因为编译器可以自动进行推导。生命周期的主要作用是避免悬垂引用,它会导致程序引用了本不该引用的数据: {let r;{let x …...
【办公类-21-11】 20240327三级育婴师 多个二级文件夹的docx合并成docx有页码,转PDF
背景展示:有页码的操作题 背景需求: 实操课终于全部结束了,把考试内容(docx)都写好了 【办公类-21-10】三级育婴师 视频转文字docx(等线小五单倍行距),批量改成“宋体小四、1.5倍行…...
OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形
1、概述 什么是视图?在《OpenGL 编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变换过程类似于用相机进行拍照,主要有如下的步骤: (1)把照相机固定在三脚架上,让它对准场景(视图变换)。 (2)…...
Laplace变换-3
回忆#常见函数的Laplace变换: t z − 1 ↦ Γ ( z ) s z t^{z-1} \mapsto \frac{\Gamma(z)}{s^{z}} tz−1↦szΓ(z) (要求 R e ( z ) > 0 \mathrm{Re}(z)>0 Re(z)>0) e a t ↦ 1 s − a e^{at} \mapsto \frac{1}{s-a} eat↦s−a1…...
LVS负载均衡-DR模式配置
LVS:Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器(Director),不直接处理请求,而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层(传输层 tcp/udp)负载均衡…...
【unity】如何汉化unity Hub
相信大家下载安装unity后看着满操作栏的英文,英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国,请记住我给出的原理,不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步:我们打开Uni…...
【算法】KMP-快速文本匹配
文章目录 一、KMP算法说明二、详细实现1. next数组定义2. 使用next加速匹配3. next数组如何快速生成4. 时间复杂度O(mn)的证明a) next生成的时间复杂度b) 匹配过程时间复杂度 三、例题1. [leetcode#572](https://leetcode.cn/problems/subtree-of-another-tree/description/)2.…...
多维数组和交错数组笔记
1.) 关于数据的几个概念: Rank,即数组的维数,其值是数组类型的方括号之间逗号个数加上1。 Demo:利用一维数组显示斐波那契数列F(n) F(n-1) F(n-2) (n >2 ),每行显示5项,20项. static void Main(string[] args){int[] F n…...
Python(django)之单一接口展示功能前端开发
1、代码 建立apis_manage.html 代码如下: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav c…...
【大模型】非常好用的大语言模型推理框架 bigdl-llm,现改名为 ipex-llm
非常好用的大语言模型推理框架 bigdl-llm,现改名为 ipex-llm bigdl-llmgithub地址环境安装依赖下载测试模型加载和优化预训练模型使用优化后的模型构建一个聊天应用 bigdl-llm IPEX-LLM is a PyTorch library for running LLM on Intel CPU and GPU (e.g., local P…...
Kubernetes示例yaml:3. service-statefulset.yaml
service-statefulset.yaml 示例 apiVersion: apps/v1 kind: statefulset metadata:...... spec:......volumeMounts:- name: pvcmountPath: /var/lib/arangodb3VolumeClaimTemplates:- metadata:name: pvcspec:accessModes: [ "ReadWriteOnce" ]storangeClassName: …...
Windows平台cmake编译QT源码库,使用VScode开发QT
不愿意安装庞大的QT开发IDE,可以编译QT源码库。 下载源码可以用国内镜像,如清华大学的:Index of /qt/archive/qt/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我用的是 6.5.3,进去之后,不要下载整个源…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
