Netty笔记

Netty

1.什么是Netty?

  • Netty 是由 JBOSS 提供的一个 Java 开源框架。

  • 异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。

  • Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。

2.IO模型

IOModeljpg

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();

黏包:多行数据传输后行数减少

半包:一行数据传输后行数变多

posted @   little_lunatic  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示