NIO 网络编程模型
1.注册建立连接事件(Selector)
2.客户端发起连接请求
3.服务端接收请求,启动建立连接事件处理器(Acceptor Handler)
4.Acceptor Handler创建与客户端的连接
5.Acceptor Handler响应客户端建立连接请求
6.Acceptor Handler向Selector注册连接可读事件
7.Client发起请求
8.Selector启动连接读写处理器(Read&Write Handler)
9.Read&Write Handler处理与Client的读写业务
10.Read&Write Handler响应Client的请求
11.Read&Write Handler向Selector注册连接可读事件
笔记笔记~记笔记。。。
总结
笔记2
biji1
First
First
NIO网络模型图
接收服务器响应
客户端编写:
1 连接服务 - 一行代码就够而且很直观,没有什么函数式接口嵌套结构
SocketChannel.open(new InetSocketAdress(.... ))
2 发送数据 - 也很简单直观,一行代码
这里他用了终端输入 Scanner 作为要发送数据的来源,这个也可以学习下,如果要急速开发,甚至连网页界面也可以省略
socketChannel.write(.... )
3 接收响应 (这一节里没有,下节课)
NIO编程实现步骤
3.Selector简介
1)作用:IO就绪选择
2)地位:NIO网络变成的基础
3)代码片段:
4)SelectionKey简介
2,Buffer简介
1)作用:读写Channel中的数据
2)本质:一块内存区域
3)Buffer的属性:
Capacity:容量
Position:位置
Limit:上限
Mark:标记
4)AIP:
NIO核心
Channel :通道
特点:
1)双向性(通道和流类似,但是流是单向的,而通道多双向的,既可以读也可以写)
2)非阻塞性
3)操作唯一性(NIO中,对Channel的操作具有唯一性,基于数据块的一个操作,通过buffer来操作)
常用的实现类:
1)文件类:FileChannel
2)UDP类:DatagramChannel
3)TCP类:ServerSocketChannel / SocketChannel
socket回顾:
Channel的使用:
Buffer: 缓冲区
Selector:选择器 / 多路复用器
NIO模型的改进
非阻塞式IO模型
弹性伸缩能力强
单线程更加的节省资源
NIO模型
NIO网络模型
基于非阻塞IO的模型
课程给出了一个思路:维护一个set集合,里面存放客户端发过来的请求,不断的去循环这个set,如果发现read有数据返回就交给一个handler去处理,否则就不处理当前这个请求,继续去循环下一个
BIO模型的缺点
阻塞式IO模型
弹性伸缩能力差:一个客户端对于一个服务端的业务线程,线程数和客户端是1:1的关系
多线程消耗资源
BIO网络模型
BIO:阻塞IO ,在读写过程中会出现阻塞
如果客户端没有进一步的响应,此时服务端会处于长时间的等待状态。
如果服务端有大量的线程处于等待状态,显然会对服务端的性能造成影响。
NIO网络编程模型
NIO简介
编程模型
前置知识:
JAVA基础知识
BIO网络编程基础知识
多线程基础知识
NIO网络编程模型
NIO网络编程详解
NIO网络编程实战
NIO网络编程的缺陷
NIO:非阻塞I/O 或 New I/O
应用场景:高并发网络编程
模型:对事物共性的抽象
编程模型:对编程共性的抽象
channel是对输入流输出流的封装,它是是双向的,一个channel既可以读有可以写,同时具备非阻塞性,基于数据块(字节数组)的操作且只能通过Buffer来操作
serversocket是BIO(accept方法(服务端)、getInputStream/outputStream方法(客户端))
大致流程:创建端对象,绑定端口、监听连接
selector、serversocketchannel、socketchannel、bytebuffer、线程、bio基础,这些是nio的前置知识,学习曲线比较陡
客户端的断连、重连、网络间断、断包读写、失败缓存、网络阻塞、异常码流处理等问题很棘手,投入的时间和成本非常巨大