BIO、NIO、AIO

bio(blocking) 1个请求对应一个线程,线程池处理多次连接,面向读写流,读写比nio效率高 
nio(多路复用)  多个请求对应一个线程,面向缓存器,中间有一层(Selector接收服务器注册)(netty)
AIO(异步io ) 连接、读写异步操作


Selector选择器、Channel通道、Buffer缓存

线程Reactor模式

​​​​​​​

接受客户端连接、读写、业务操作3个线程。

 NIO之Buffer介绍

堆上分配:  分配速度更快 业务操作
直接内存分配: 网络通讯更快 直接网络操作


capacity:总共大小、position:当前读写下标、limit:最大允许读写下标
读切换到写  需要调用flip()方法。position定位到写时候开始的位置,同时标出limit位置
socket 操作系统内核 会自动创建1个读写缓存区

 nio介绍

servicesocketchannel(监听客户端连接)、socketchannel(监听读写)

nio服务器介绍

1、创建选择器(selector),打开监听通道(serverChannel),开启非阻塞模式,绑定端口,注册监听客户端连接请求(把serverChannel注册到selector上)
2、线程中循环遍历selector,当有请求连接得到SelectionKey,通过ServerSocketChannel(key.channel())的accept创建SocketChannel实例(完成该操作意味着完成TCP三次握手,TCP物理链路正式建立),开启非阻塞,把SocketChannel注册到selector上
3、读消息,创建ByteBuffer,并开辟一个1M的缓冲区,读取请求码流,返回读取到的字节数,读取到字节,对字节进行编解码,flip(),根据缓冲区可读字节数创建字节数组,将缓冲区可读字节数组复制到新建的数组中,处理数据,发送应答消息

nio客户端介绍

1、创建选择器的(selector),创建SocketChannel,开启非阻塞模式
2、线程中,通过SocketChannel.connect 判断是否连接完成,未连接把SocketChannel注册到selector(事件类型为OP_CONNECT),如果已连接注册OP_READ事件
3、循环遍历selector,获取当前有哪些事件可以使用(SelectionKey),获得SocketChannel(key.channel()),判断是否连接,连接成功注册OP_READ事件(剩下跟服务器步骤3一样)
4、上面步骤执行完,进行发送,将消息编码为字节数组,根据数组容量创建ByteBuffer,将字节数组复制到缓冲区,flip操作,发送缓冲区的字节数组

应用场景

BIO读写比 nio 效率高,适用于连接数比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中

NIO适合处理连接数目特别多,但是连接比较短小的场景

AIO方式使用于连接数目比较多且比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂

pingpong 内不定义的2个心跳针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值