org.jboss.netty.bootstrap
类 ServerBootstrap

java.lang.Object
  继承者 org.jboss.netty.bootstrap.Bootstrap
      继承者 org.jboss.netty.bootstrap.ServerBootstrap
所有已实现的接口:
ExternalResourceReleasable

public class ServerBootstrap
extends Bootstrap

创建一个服务端Channel和接受传入连接的帮助类.

仅仅针对面向连接的传输

该启动器只针对面向连接的传输(如TCP/IP)和本地传输. 若是有无连接传输则使用 ServerBootstrap 代替.如果你正使用一个不接受传入连接且不通过创建子channel接受消息的无连接传输如UDP/IP,千万不要使用该帮助类.

父channel和它的子channel

一个父channel应该是一个接受传入连接的channel. 它是通过该启动器的ChannelFactory对象通过 bind()bind(SocketAddress)创建的.

一旦绑定成功,该父channel开始接受传入的连接,而且接受了的连接则成为该父channel的子channel.

配置通道

Options 属性集常常用来配置父channel和它的子channel. 要配置子channel,则在实际的属性名前加上"child."前缀:
 ServerBootstrap b = ...;
 
 // 父channel的属性集
 b.setOption("localAddress", new InetSocketAddress(8080));
 b.setOption("reuseAddress", true);
 
 // 子channel的属性集
 b.setOption("child.tcpNoDelay", true);
 b.setOption("child.receiveBufferSize", 1048576);
 
要了解更多有效选项集的详细信息,请参阅ChannelConfig和相应子类.

配置一个父channel pipeline

极少自定义设置一个父channel的pipeline,因为它应该是比较规范的. 然而, 你可能想要添加一个handler去处理一些特殊的需求,如一个超级用户对普通用户降级和为了更好的安全性改变当前VM的安全管理. 对于这些案例,可以使用 parentHandler属性来解决.

配置一个子channel pipeline

每个channel都拥有自己的 ChannelPipeline,你可以通过两个方式设置. 一个推荐的方式是通过调用Bootstrap.setPipelineFactory(ChannelPipelineFactory)方法 .
 ServerBootstrap b = ...;
 b.setPipelineFactory(new MyPipelineFactory());
 
 public class MyPipelineFactory implements ChannelPipelineFactory {
   public ChannelPipeline getPipeline() throws Exception {
     // Create and configure a new pipeline for a new channel.
     ChannelPipeline p = Channels.pipeline();
     p.addLast("encoder", new EncodingHandler());
     p.addLast("decoder", new DecodingHandler());
     p.addLast("logic",   new LogicHandler());
     return p;
   }
 }
 

另外一个方法只有在特定的情况使用,是使用默认的pipeline并且让bootstrap使用使用浅拷贝为每个新的channel设置:

 ServerBootstrap b = ...;
 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的引用添加到新的管道上,而不是克隆 ChannelHandler. 因此,你不能使用该方法在一个接受传入连接去创建子通道的服务器上打开多个Channel.

为不同的Channel应用不同的设置

ServerBootstrap仅仅是个帮助类. 他不分配和管理任何资源.管理资源是使用在构造方法指定的 ChannelFactory类进行管理.因此,你可以在不同的ServerBootstrap实例上使用相同的 ChannelFactory为不同的Channel应该不同的设置.


构造方法摘要
ServerBootstrap()
          创建一个没有ChannelFactory设置的实例.
ServerBootstrap(ChannelFactory channelFactory)
          使用指定的ChannelFactory创建一个实例.
 
方法摘要
 Channel bind()
          使用当前"localAddress"属性设置绑定的本地地址创建一个channel.
 Channel bind(java.net.SocketAddress localAddress)
          /** 创建一个绑定到指定的本地地址的channel.
 ChannelHandler getParentHandler()
          返回一个用来拦截最近绑定用来接受传入连接的服务端channel事件的可选ChannelHandler.
 void setFactory(ChannelFactory factory)
          设置一个用来处理I/O操作的ChannelFactory ,这个方法只能被调用一次,如果通道工厂已经通过构造函数设置了,该方法会抛出异常
 void setParentHandler(ChannelHandler parentHandler)
          设置一个用来拦截最近绑定用来接受传入连接的服务端channel事件的可选ChannelHandler .
 
从类 org.jboss.netty.bootstrap.Bootstrap 继承的方法
getFactory, getOption, getOptions, getPipeline, getPipelineAsMap, getPipelineFactory, releaseExternalResources, setOption, setOptions, setPipeline, setPipelineAsMap, setPipelineFactory
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

ServerBootstrap

public ServerBootstrap()
创建一个没有ChannelFactory设置的实例. setFactory(ChannelFactory)方法 必须在任何I/O操作请求前被调用.


ServerBootstrap

public ServerBootstrap(ChannelFactory channelFactory)
使用指定的ChannelFactory创建一个实例.

方法详细信息

setFactory

public void setFactory(ChannelFactory factory)
设置一个用来处理I/O操作的ChannelFactory ,这个方法只能被调用一次,如果通道工厂已经通过构造函数设置了,该方法会抛出异常

覆盖:
Bootstrap 中的 setFactory
抛出:
java.lang.IllegalArgumentException - 如果指定的factory 属性值不是一个 ServerChannelFactory 则抛出异常

getParentHandler

public ChannelHandler getParentHandler()
返回一个用来拦截最近绑定用来接受传入连接的服务端channel事件的可选ChannelHandler.

返回:
返回一个父channel handler. 如果父channel handler没有设置,则返回null.

setParentHandler

public void setParentHandler(ChannelHandler parentHandler)
设置一个用来拦截最近绑定用来接受传入连接的服务端channel事件的可选ChannelHandler .

参数:
parentHandler - 父channel handler.如果参数为null,则取消当前设置的父channel handler.

bind

public Channel bind()
使用当前"localAddress"属性设置绑定的本地地址创建一个channel. 该方法和以下代码很相似:
 ServerBootstrap b = ...;
 b.bind(b.getOption("localAddress"));
 

返回:
返回一个新的已经绑定的接受传入连接的channel
抛出:
java.lang.IllegalStateException - 如果 "localAddress" 属性没有设置则抛出异常
java.lang.ClassCastException - 如果 "localAddress" 属性的值既不是SocketAddress也不是 null时抛出异常
ChannelException - 如果创建新的channel并绑定到本地地址失败时抛出异常

bind

public Channel bind(java.net.SocketAddress localAddress)
/** 创建一个绑定到指定的本地地址的channel.

返回:
返回一个新的已经绑定的接受传入连接的channel
抛出:
ChannelException - 如果创建新的channel并绑定到本地地址失败时抛出异常