【客户端】
我想建立连接
置一些标志,表示该url已经准备开始连接,其他尝试暂别进行
我打开socket通道,要建了
打开一个socketChannel,并设置该channel相关属性
好,调了,通道你后面建立去吧
异步连接,非同步阻塞,即刻返回,tcp连接在后面其实已经悄麽悄麽开建了
我方是否真好做好连接建立准备呢?
将channel注册给selector等,选选人,看看谁来负责OP_CONNECT事件、谁来负责OP_READ、OP_WRITE事件等。
为连接的到来做好一切准备。详见下面【备注】
连接来啦,速速创建session
channel里来了OP_CONNECT事件,太好啦,那么开始创建会话。
会话属性设置:handler, 协议,写消息队列,消息派发器,是否并发读写,会话超时时间等。
通知上层,我已经建立好啦!任务完成!
回调方式,future神马的,总之,通知到就好了。
【备注】
1) Reactor | 休闲健身中心(反应堆) |
2) Selector | 健身房 |
3) Channel |
会员 |
4) SelectionKey |
会员卡 |
按我的理解,这其实是一个故事:
在休闲健身中心,有一家健身房,会员们要想健身必须首先注册为会员,注册后会得到会员卡,会员卡终身有效。每个会员都有感兴趣的项目,如单车、瑜珈、跑步、或是彪悍的甩肉机。
翻译为这个场景:
在Reactor里,有一家selector,channel要想收发事件必须首先注册,注册后会得到selectionkey,selectionkey终身有效。每个selectionkey都有感兴趣的项目,如OP_CONNECT、OP_READ、OP_WRITE等。
- 通道要向选择器进行注册,选择器会为通道分配资源
- 一个通道至多只能在任意特定选择器上注册一次
- 向选择器注册后,通道在注销 之前将保持注册状态。通过取消表示通道注册的键,才能真正注销通道
- 如果选择器本身已关闭,则将注销该通道,并且表示其注册的键将立即无效
- 多个并发线程可安全地使用可选择的通道