Netty学习

本文深入探讨了Java NIO的三大核心组件——Channel、Buffer和Selector。Channel是双向数据传输通道,常见类型包括FileChannel、DatagramChannel和SocketChannel。Buffer用于数据读写,使用时涉及fillp()、get()、clear()和compact()等方法。Selector则允许单线程管理多个非阻塞Channel,适合高并发低流量场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


NIO:non-blocking io

三大组件

channel & Buffer

  • channel是读写数据的双向通道,可以将数据读入到buffer中,也可以将buffer的数据写入到channel

  • 常见的channel有:

    • FileChannel:文件传输通道
    • DatagramChannel:udp数据传输通道
    • SocketChannel:tcp客户端数据传输通道
    • ServerSocketChannel:tcp数据传输通道
  • 常见的buffer有

    • ByteBuffer

ByteBuffer

正确使用ByteBuffer

  1. 调用channel.read(buffer)把数据写入到buffer
  2. 调用filp()切换到读模式
  3. buffer读取数据,调用buffer.get()
  4. 调用clear()或者compact()切换到写模式
  5. 重复1-4的步骤

ByteBuffer的结构

  • capacity:容量
  • position:索引下标
  • limit:读写限制
    在这里插入图片描述
  1. 一开始new一个buffer的时候,buffer内容是空,写入的限制和容量是一样大的,position是在开头
    在这里插入图片描述
  2. 当写模式下,我们写入四个数据,position会随着写入的数据而位置发生改变,写入限制和容量都不会变
    在这里插入图片描述
  3. filp切换到读模式之后,position会从头开始读取数据,limit切换到读能读取到的范围(不会读到空)
    在这里插入图片描述
    在这里插入图片描述
  4. 如果读取完所有的数据,再clear切换到写模式下,position、limit、capacity都会和原来空的时候的位置一模一样
    在这里插入图片描述
  5. 如果调用的是compact方法,这个时候还没有没有读完的数据,就会把这些数据压缩到首位,再重新写数据

selector

  • 多线程版的服务器端:一个线程处理一个客户端连接,但是这样连接数增加,会导致内存占用会随着连接数的增加而消耗,甚至瘫痪;线程的切换会导致成本提高。所以这种多线程版服务器端只适合于连接数比较少的情况。

  • 线程池版的服务器端:socket是工作再阻塞模式下,使用线程池的服务器端,可以限制线程池的数量,但是缺点是:阻塞模式下,线程只能处理一个socket连接,也就是说socket1在连接的时候,即使这个连接没有读写请求,socket3是不能被处理的,必须要等到socket1断开才可以被处理。这种比较适合短连接情况,如http请求。
    在这里插入图片描述

  • selector版的服务器端:selector的作用是配合一个线程来管理多个channel,获取channel上发生的事情,这些channel是工作再非阻塞模式下的,这种适合连接数量比较多,但是流量比较低的场景
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值