Netty-预言

10 篇文章 0 订阅

NIO

三大组件

  1. channel:通道
    1. BIO中的stream是单向的,例如FleInputStream对象只能进行读取数据的操作
    2. NIO中的通道(channel)是双向的,可以进行读写操作
    3. 常用的channel:
      1. FileChannel:用于文件数据的读写
      2. DatagramChannel:UDP的数据读写
      3. ServerSocketChannel:TCP的数据读写
      4. SocketChannel:TCP的数据读写
  2. buffer:缓冲区(内存),实际上是一个容器,一个特殊的数组缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况
    1. Buffer是一个顶级父类,是一个抽象类,子类有:
      1. ByteBuffer:存储字节数据到缓冲区
      2. ShortBuffer:存储字符串数据到缓冲区
      3. CharBuffer:存储字符数据到缓冲区
      4. IntBuffer:存储整数数据到缓冲区
      5. LongBuffer:存储长整型数据到缓冲区
      6. DoubleBuffer:存储小数到缓冲区
      7. FloatBuffer:存储小数到缓冲区
  3. selector:选择器,能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对事件进行相应的处理。这样就可以用一个单线程去管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大的减少了系统的开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免的多线程之间上下文切换导致的开销

ByteBuffer

  1. buffer的正确使用姿势:
    1. 向 buffer 写入数据,例如调用 channel.read(buffer)
    2. 调用 flip() 切换至读模式
    3. 从 buffer 读取数据,例如调用 buffer.get()
    4. 调用 clear() 或 compact() 切换至写模式
    5. 重复 1~4 步骤
  2. ByteBuffer 结构
    1. capacity:容量
    2. position:位置
    3. limit:写入限制
  3. ByteBuffer 常用方法
    1. 分配空间
      1. ByteBuffer.allocate(16)
      2. ByteBuffer.allocateDirect(16)
  4. 写入数据
    1. 调用 channel 的 read 方法
    2. 调用 buffer 自己的 put 方法
  5. 读取数据
    1. 调用 channel 的 write 方法
    2. 调用 buffer 的 get 方法

注意:get 方法会让 position 读指针向后走,如果想重复读取数据

  • 可以调用 rewind 方法将 position 重新置为0
  • mark:做一个标记,记录 position 位置;reset :是将position 重置到 mark 的位置
  • 或者调用 get(int i) 方法获取索引 i 的内容,它不会移动指针
  1. Scattering Reads:分散读取
  2. Gathering Writes:集中写入

文件编程

  1. FileChannel:只能工作在阻塞模式下
    1. 获取
      1. 通过 FileInputStream 获取的 channel 只能读
      2. 通过 RandomAccessFile 是否能读写根据构造 RabdomAccessFile 时的读写模式决定
      3. 通过 FileOutputStream 获取的 channel 只能写
    2. 读取:会从 channel 读取数据填充ByteBuffer ,返回值表示读到了多少字节,-1表示到达了文件的末尾
    3. 写入
    4. 关闭:channel 必须关闭
  2. 两个 Channel 传输数据:transferTo()

网络编程

  1. 非阻塞和阻塞
  2. 多路复用(selector)
    1. select何时不阻塞
      1. 事件发生时
        1. 客户端发起连接请求,会触发accept事件
        2. 客户端发送数据过来,客户端正常、异常关闭时,都会触发read事件,另外如果发送的数据大于buffer 缓冲区,会触发多次读取事件
        3. channel 可写,会触发 write 事件
        4. 在linux 下nio bug发生时
      2. 调用 selector.wakeup()
      3. selector 所在线程 interrupt
      4. 调用 selector.close()
  3. IO 模型
    1. 阻塞 IO
    2. 非阻塞 IO
    3. 多路复用
    4. 信号驱动
    5. 异步 IO

NIO vs BIO

  1. stream vs channel
    1. stream 不会自动缓数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层)
    2. stream 仅支持阻塞API,channel 同时支持阻塞、非阻塞API,网络channel 可配合selector 实现多路复用
    3. 二者均为双全工,即读写可同时进行
  2. IO 模型:同步阻塞、同步非阻塞、同步多路复用、异步非阻塞
    1. 同步:线程自己去获取结果(一个线程)
    2. 异步:线程自己不去获取结果,而是由其他线程送结果(至少两个线程)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值