异步设计
CallBack
Futures
NIO JDK1.4
NIO2 JDK1.7
标准的IO:基于字节流和字符流,面向数据流
NIO:基于通道(Channel)和缓冲区(Buffer),面向缓冲区
读操作:通道 -- 数据 --> 缓冲区
写操作:缓冲区 -- 数据 --> 通道
NIO核心:
Buffer
Channel
Selector
Buffer 本质是内存片段,Buffer有三个属性:capacity,position,limit
capacity读写模式中都表示容量,capacity和position的含义与Buffer的读写模式有关
Buffer的写模式:
默认初始化时position=0,position最大=capacity-1
limit能写入的最大数据量=buffer的容量capacity
Buffer的读模式:
position=0,每次读取,position向后移动
limit=写模式时的position
Buffer的成员变量:
capacity:int
limit:int
mark:int
position:int
Buffer的方法:
clear():Buffer
flip():Buffer
Buffer的实现类:
ByteBuffer,CharBuffer等
IO Model:
blocking IO
nonBlocking IO
IO multiplexing
asynchronous IO
与network IO相关的两个对象:process(OR thread)和kernel
Selector 调度多个nonblocking IO,检查一个或多个NIO Channel的状态是否处于可读、可写。
Selector实现单线程管理多个Channels,即管理多个网络连接。
Selector属于IO multiplexing的情况
Selector.select() 轮询查找
Channels的四种状态:
Connect
Accept
Read
Write
对应SelectionKey的四种状态:
SelectionKey.OP_CONNECT
SelectionKey.OP_ACCEPT
SelectionKey.OP_READ
SelectionKey.OP_WRITE
Java IO
字符流的本质:字节流读取+查码表(根据码表映射字符)
处理流和节点流的关系:处理流包装节点流,使用到装饰器设计模式,消除节点流的差异。
编码和解码
编码:明文的字符序列 ----> 二进制的字节序列
解码:二进制的字节序列 ----> 明文的字符序列
Netty中:
编码:Java对象 ----> 字节
解码:字节 ----> Java对象
网络数据是一系列字节。
普通字符串和application/x-www-form-urlencoded MIME字符串
URLDecoder
URLEncoder