底层连接tcp连接,它怎么就建立起来了?【客户端】

【客户端】

红唇 我想建立连接

置一些标志,表示该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等。

  • 通道要向选择器进行注册,选择器会为通道分配资源
  • 一个通道至多只能在任意特定选择器上注册一次
  • 向选择器注册后,通道在注销 之前将保持注册状态。通过取消表示通道注册的键,才能真正注销通道
  • 如果选择器本身已关闭,则将注销该通道,并且表示其注册的键将立即无效
  • 多个并发线程可安全地使用可选择的通道

http://www.goldendoc.org/2011/07/java-nio-%E9%80%89%E6%8B%A9%E5%99%A8%E4%B8%8E%E9%80%9A%E9%81%93_3%EF%BC%88%E9%80%89%E6%8B%A9%E5%99%A8%E5%A4%84%E7%90%86%E6%B3%A8%E5%86%8C%E7%9A%84%E8%BF%87%E7%A8%8B%EF%BC%89/

原文地址:https://www.cnblogs.com/alipayhutu/p/2549907.html