Netty笔记
Netty
1.什么是Netty?
-
Netty 是由 JBOSS 提供的一个 Java 开源框架。
-
异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。
-
Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。
2.IO模型
3.NIO三大组件
3.1 Channel
双向数据传输通道。
常用的Channel:
-
FileChannel
-
DatagramChannel
-
SocketChannel
-
ServerSocketChannel
3.2 Buffer
缓冲区,把数据临时存储在内存中。
ByteBuffer 重要属性:
-
capacity:容量
-
position:读取 / 写入的位置
-
limit:读取 / 写入限制
flip()切换至读模式:position切换为读取位置,limit切换为读取限制。
compact()切换至写模式:把未读数据的向前压缩,然后切换到写模式。
clear()切换至写模式:直接从头开始,覆盖掉未读的数据。
常用的 Buffer:
-
ByteBuffer 是一个抽象类,以下是ta的实现类
-
MappedByteBuffer
-
DirectByteBuffer
-
HeapByteBuffer
-
-
ShortByteBuffer
-
IntBuffer
-
LongBuffer
-
FloatBuffer
-
DoubleBuffer
-
CharByteBuffer
3.3 Selector
选择器。
selector 配合一个线程管理多个 channel,获取channel上发生的时事件。适合连接数多,但流量低的场景。
调用selector的select()会阻塞,直到channel发生了读写就绪事件
HeapByteBuffer
java堆内存,读写效率低,受到GC的影响
DirectByteBuffer
直接内存,读写效率高(少一次拷贝),不会受到GC的影响,分配效率低,使用不当会造成OOM。
ByteBuffer
allocate(10),分配缓冲区,大小是固定的不能动态调整。
rewind(),position=0,从头开始读;
mark(),加标记、reset(),position=mark索引位置,从mark位置开始读
ByteBuffer & String 互转
ByteBuffer encode = StandardCharsets.UTF_8.encode("hello你好");
String decode = StandardCharsets.UTF_8.decode(encode).toString();
ByteBuffer buffer = ByteBuffer.wrap("哈喽helll".getBytes());
String decode2 = StandardCharsets.UTF_8.decode(buffer).toString();
黏包:多行数据传输后行数减少
半包:一行数据传输后行数变多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?