Java NIO
2016-12-04 16:00:08 0 举报
Java NIO(New I/O)是一个可以替代标准的Java I/O API的API,它提供了与文件和网络I/O的高性能访问。NIO引入了通道和缓冲区的概念,使得数据的读取和写入变得更加高效。NIO主要有三大核心组件:Channel、Buffer和Selector。Channel是连接传输数据的载体,可以是文件、网络套接字等;Buffer是数据的容器,用于存储数据;Selector用于管理多个Channel,可以实现单线程处理多个Channel的事件。Java NIO的主要优势在于其非阻塞性,可以处理大量并发连接,适用于高并发场景。
作者其他创作
大纲/内容
listen监听while(true)selector.select
SocketChannel
客户端套接字
SelectionKeyImpl
Channel SelectionKey Selector 创建流程
获取SelectorSelector.open
ServerSocketChannel
服务端套接字
openbind(address)
OP_READ有client可读获取client套接字将其注册到selectorclient的channel.register(OP_WRITE)
SelectorImpl
事件处理selector.selectedKeys
Channel SelectionKey Selector 三者关系
SelectionKey
OP_READ 1OP_WRITE 4OP_CONNECT 8OP_ACCEPT 16
selector()interestOps()channel() 返回创建该key的chclear()
Server端
Selector
Keys
返回keykey.interestOps(ops)
client端
NIO流程
Channel
isOpenclose
SelectorProvider
选择器提供者提供了五个类的打开(创建)方式有操作系统进行打开
openSelectoropenPipeopenServerSocketChannelopenSocketChannelopenDatagramChannel
可读状态 完成业务 注册可写可写状态(由socket缓冲区决定没满就可写) 完成业务 注册可读
WindowsSelectorProvider
单例
addKey(key)
SubSelector
内部类
poll()poll0() native方法processSelectedKeys()processFDSet 对键集进行处理
打开socketServerSocketChannel.open
EPollSelectorProvider
linux2.6以上版本
连接serverportsocketChannel.connect(port)
channelselector
keys 键集 所有keyselectedKeys 已选择键集publicKeyspublicSelectedKeysinterestOpsListEventHandler
select()lockAndDoSelect()doSelect()implRegister(key)registerInterestOpsenableInterestOps
绑定serverPortServerSocket
isConnectable完成连接client.write 写入数据client.register(OP_READ)
AbstractSelectableChannel
WindowsSelectorImpl
SubSelector
doSelect() 调用poll()implRegister()
打开socketSocketChannel.open
返回 Key
注册OP_ACCEPT接收事件server的channel.register
AbstractInterruptibleChannel
close()implCloseChannel()isOpen()begin() read方法会调用end() read方法会调用blockedOn()
multiplexor 多路复用器,用于处理selectableChannel
open()keys()selectedKeys()select()select(timeout)selectNow()wakeup() 唤醒等待事件的进程(select方法阻塞的)
AbstractSelector
selectorOpenSelectorProvider providercancelledKeys 取消键集
AbstractSelectionKey
valid 该key是否失效(被删除)
isValid()cancel()
注册OP_CONNECT连接事件socketChan.register
SelectableChannel
多路复用通道
OP_WRITE有client可写获取client套接字将其注册到selectorclient的channel.register(OP_READ)
SelectionKey[] keys
监听while(true)selector.select
SelectorProvider providerSelectionKey[] keys
channel SelChImpl 绑定channelselector 绑定selectorindexinterestOpsreadyOps
OP_ACCEPT有client接入获取与client连接的套接字 sever.accept将其注册到selectorclient的channel.register(OP_READ)
0 条评论
下一页