码迷,mamicode.com
首页 > 其他好文 > 详细

ServerBootstrap

时间:2015-07-27 00:40:38      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:


一 简介 

    1 Only for connection oriented transports

      该类用于创建一个server端的通道,用于接收 例如 tcp 和 本地的连接,不能用于接收udp连接。


    2 Parent channel and its children

       parent channel 是一个用来接收连接的通道。可以用 bootstrap 的channelFactory的bind方法创建

       一旦成功 bind,parent channel开始接收连接,并且接收的连接成为这个parent channel的child channel;


    3 Configuring channels

      setOption方法可以用来给parent channel和childparent设置配置信息。

      为了配置 child channel ,需要在配置文件的名字前面加上 child.

     例如    

 
{@link ServerBootstrap} b = ...; 

 * 

 * // Options for a parent channel 

 * b.setOption("localAddress", new {@link InetSocketAddress}(8080)); 

 * b.setOption("reuseAddress", true); 

 * 

 * // Options for its children 

 * b.setOption("child.tcpNoDelay", true); 

 * b.setOption("child.receiveBufferSize", 1048576); 





    可以通过 channelConfig和他的子类查看配置的详细信息


 4 Configuring a parent channel pipeline

      每一个channel 都有他自己的 channelPipeline ,可以通过两种方式对其进行配置

      a 推荐的方式是 通过 setPipelineFactory 方法设置一个 ChannelPipelineFactory      

{@link ServerBootstrap} b = ...; 

 * b.setPipelineFactory(new MyPipelineFactory()); 

 * 

 * public class MyPipelineFactory implements {@link ChannelPipelineFactory} { 

 *   public {@link ChannelPipeline} getPipeline() throws Exception { 

 *     // Create and configure a new pipeline for a new channel. 

 *     {@link ChannelPipeline} p = {@link Channels}.pipeline(); 

 *     p.addLast("encoder", new EncodingHandler()); 

 *     p.addLast("decoder", new DecodingHandler()); 

 *     p.addLast("logic",   new LogicHandler()); 

 *     return p; 

 *   } 

 * } 



  

b.另外一种方式,在一种特定的解决方法下起作用,用于默认的pipeline 并且让 bootstrap 浅copy默认的pipeline 为了每一个新的channel

  

 
 * {@link ServerBootstrap} b = ...; 

 * {@link ChannelPipeline} p = b.getPipeline(); 

 * 

 * // Add handlers to the default pipeline. 

 * p.addLast("encoder", new EncodingHandler()); 

 * p.addLast("decoder", new DecodingHandler()); 

 * p.addLast("logic",   new LogicHandler()); 



这里要注意 浅拷贝    表示 添加channelHandler 不是其clone 而仅仅是 指针加到新的 pipeline。

因此 你不能用这个方式如果你计划打开多于一个的channel 或者运行用来接收连接来创建字channel的server模式



5, Applying different settings for different {@link Channel}s

      serverBootstrap 仅仅是一个辅助类。他既不分配也不管理资源。 

       管理资源的是 ChannelFactory 类,他实现了在 ServerBootstrap中定义的实现,

        因此,可以创建很多ServerBootstrap 实例 只要 你使用同一个ChannelFactory实例 去 为不同的channel应用不同的设置。



二  属性

        volatile ChannelHandler parentHandler


三 方法

      1  ServerBootstrap()


      2.ServerBootstrap(ChannelFactory channelFactory)


      3.void setFactory(ChannelFactory factory) 


      4.ChannelHandler getParentHandler()

             返回 一个可选的 channelHandler ,他会拦截 一个 最近的接受客户端连接的 server端channel的事件


      5.void setParentHandler(ChannelHandler parentHandler)

            参考上面

     

     6.Channel bind() 

          创建一个新的channel ,用于绑定本地地址  

          类似于   

           

 
     * {@link ServerBootstrap} b = ...; 

     * b.bind(b.getOption("localAddress")); 




     7 Channel bind(final SocketAddress localAddress)

         创建一个新的channel ,绑定到指定的本地地址

         流程:

          7.1 如果 传入的参数 localAddress为空 则抛出异常 NullPointerException("localAddress")

          7.2 构建一个 LinkedBlockingQueue<ChannelFuture> futureQueue实例

          7.3 通过localAddress 和 LinkedBlockingQueue<ChannelFuture> 构建一个 Binder 实例

          7.4 获取parentHandler

          7.5 通过 Channels.pipeline() 构建一个新的 DefaultChannelPipeline 实例 作为 bossPipeline

          7.6  bossPipeline.addLast("binder", binder);

          7.7 如果 parentHandler不为空 则 bossPipeline.addLast("userHandler", parentHandler)

          7.8 通过 channelFactory.newChannel(bossPipeline) 返回一个新的channel实例

          7.9 循环获取 futureQueue的值 ChannelFuture 如果 返回成功则 返回channel,否则抛出异常

          

                      


               

       

ServerBootstrap

标签:

原文地址:http://my.oschina.net/dyaod/blog/483972

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!