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();
黏包:多行数据传输后行数减少
半包:一行数据传输后行数变多


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号