底层连接tcp连接,它怎么就建立起来了?【服务器端】

【Server端】

高脚杯 先说说,连接配置

协议类型(指定commandFactory)、端口、发送缓冲队列最大字节数、回调线程池、允许的最大回调个数、定时扫描连接的时间间隔,云云;

 

高脚杯 配置都清楚了,那就开工吧

根据配置,创建上下文context;

 

高脚杯 可能会有各种事件过来吧,得注册监听器和处理器

在context中注册:各种类型的命令,生命周期连接监听器,连接选择器,心跳包处理器,云云;

 

高脚杯 请个大管家:控制器controller

在controller中设置:backlog参数、协议工厂、handler(这个很重要)、关闭连接时逗留的超时值、socket配置、selector池大小、读事件派发器;

 

高脚杯 万事俱备,所有人注意!开工啦!

controller绑上本地IP、端口:selectorManager/reactor开工,socketchannel绑IP,建会话,各listener开工;

 

 

还是想,说个故事,可能不够精准,但味道应该是对的:

  • 有位老爷,他知道家里所有的事,他脑子里有详细完整的context;
  • controller是大管家,管些细琐杂务,负责与外部打交道,如各堂主、舵主、帮主;
  • 某舵主(client)愿意与老爷合作,好,建立连接,这边翠喜(processor)就处理相关事宜;
  • 该舵主(client)要做某件事,好,处理请求,这边阿福(processor)处理相关事宜;
  • 该舵主(client)派下人,抽得空的时候,发个心跳包过来,看看老爷这边是否都还好,这边阿贵(processor)处理相关事宜;
  • 该舵主(client)不想合作了,好,断开连接,这边秋香(processor)处理善后事宜;
  • 老爷会定时寻问下人,与各主的联系是否都还存在,定时扫描连接;
  • ……(未完待续)

 

【问&答】 

1.  handler是如何注入的?一层一层如何调上来?

应用层:各种handler会全部注册到上下文里。

通讯层:统一的handler来处理,解析出具体消息类型,寻找到具体处理器,进行处理;

粘合应用层与通讯层的,是session。

2. session横在中间(通讯与应用层),是什么作用?

a).对于应用层,session就表示“一个连接”,其看不到下面更多的细节。session与connection保持一一对应关系。

b). session配置:session过期时间,是否并行读写,消息派发器,队列,socketChannel信息, reactor/selector信息, handler(总的), 协议工厂(总的)。

c). session对通信层上来的各种事件,进行派发(session附着在selectionkey上),其handler会解析出具体消息类型,寻找到具体处理器,进行处理;

 3. Server端面对几百个、几千个连接,是如何建立socket连接的(reactor毕竟只有那么几个)?能否建立上万、几十万个连接,如果不能,瓶颈在哪里?

a). reactor过来的事件,如果是OP_ACCEPT,那么服务器端就要接受人家的socketchannel连接请求:SocketChannel socketChannel = serverSocketChannel.accept(); 

b). reactor/selector只是个多路复用器,个数多为 n*CPU 个,具体负责转发各种事件:OP_CONNECT, OP_ACCEPT, OP_READ, OP_WRITE。它的工作很纯粹,就是从操作系统中取出各类事件,交由相应人员处理即可;

c). 接受client端socket请求,底层三次握手,由操作系统代劳了。我们在reactor程序里,只需获取到selectionKey进行后续操作。

d). 如果机器够牛?能不能建几十万个连接呢?未完待续……

 

http://blog.csdn.net/kangojian/article/details/5711352

http://javag.iteye.com/blog/221641

posted @ 2012-06-15 13:52  技术草根女  Views(1408)  Comments(0Edit  收藏  举报