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个心跳针