标签:
一 简介
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,否则抛出异常
标签:
原文地址:http://my.oschina.net/dyaod/blog/483972