Fari

Netty

netty学习笔记

预备

I/O模型

Java共支持3中网络编程模型I/O模式:BIO、NIO、AIO

NIO

Channel1 —> Buffer1 Channel2 —> Buffer2 Channel3 —> Buffer3

Buffer1 —> Client1 Buffer2 —> Client2 Buffer3 —> Client3


1. 每一个Channel都会对应一个Buffer
2. Selector对应一个线程,一个线程对应多个Channel(连接)
3. 该图反映了三个Channel注册到该Selector
4. 程序切换到哪个Channel是由事件(Event)决定的
5. Selector会根据不同的事件在各个Channel上切换
6. Buffer本质是一个数组
7. 数据的读取和写入都是要通过Buffer,通过flip方法切换

##### Buffer
本质是一个可以读写的数据块,可以理解成一个容器对象(包含了一个数组),该对象提供了一组方法可以轻松的使用内存块。缓冲区对象内置了一些机制,能够追踪和记录缓冲区的状态变化情况,JDK提供了除了boolean之外的其他七种基本类型的Buffer

```java
public static void main(String[] args) {
    IntBuffer buffer = IntBuffer.allocate(3);  
    for (int i = 0; i < buffer.capacity(); i++) {        
       buffer.put(i);    
    }    
    // 读写转换(重要)
    buffer.flip();    

    // 是否还存在值
    while (buffer.hasRemaining())  {        
        // get方法内部存在一个游标        
        System.out.println(buffer.get());    
    }
}
Channel

类似于流,但可以双向读写(实际上channel是Stream中的一个属性) Channel在Java中是一个接口,常用的实现类:FileChannel、ServerSocketChannel、SocketChannel等 使用transferFrom/transterTo方法实现文件的快速拷贝 提供了MappedByteBuffer支持直接在堆外内存中修改文件,而不用操作系统多拷贝一次