Bootstrap
2016-05-02 10:08
459 查看
转载自:http://blog.csdn.net/abc_key/article/details/38275333
Netty包含了2个不同类型的引导,第一个是使用服务器的ServerBootstrap,用来接受客户端连接以及为已接受的连接创建子通道;第二个是用于客户端的Bootstrap,不接受新的连接,并且是在父通道类完成一些操作。
还有一种情况是处理DatagramChannel实例,这些用于UDP协议,是无连接的。换句话说,由于UDP的性质,所以当处理UDP数据时没有必要每个连接通道与TCP连接一样。因为通道不需要连接后才能发送数据,UDP是无连接协议。一个通道可以处理所有的数据而不需要依赖子通道。
下图是Bootstrap的类关系图:
为了对客户端和服务器之间的关系提供了一个共同点,Netty使用 AbstractBootstrap类。通过一个共同的父类,使得客户端和服务器的引导程序能够重复使用通用功能,而无需复制代码或逻辑。通常情况下,多个通道使用相同或非常类似的设置时有必要的,而不是为每一个通道创建一个新的引导。Netty使得AbstractBootstrap可复制,也就是说克隆一个已配置的引导,其返回的是一个可重用而无需配置的引导。Netty的克隆操作只能浅拷贝引导的EventLoopGroup,也就是说 EventLoopGroup在所有的克隆的通道中是共享的。这是一个好事情,克隆的通道一般是短暂的,例如一个通道创建一个HTTP请求。
Bootstrap
创建Bootstrap实例使用new关键字,下面是Bootstrap的方法:
• group(...),设置EventLoopGroup,EventLoopGroup用来处理所有通道的IO事件
• channel(...),设置通道类型
• channelFactory(...),使用ChannelFactory来设置通道类型
• localAddress(...),设置本地地址,也可以通过bind(...)或connect(...)
• option(ChannelOption<T>, T),设置通道选项,若使用null,则删除上一个设置的ChannelOption
• attr(AttributeKey<T>, T),设置属性到Channel,若值为null,则指定键的属性被删除
• handler(ChannelHandler),设置ChannelHandler用于处理请求事件
• clone(),深度复制Bootstrap,Bootstrap的配置相同
• remoteAddress(...),设置连接地址
• connect(...),连接远程通道
• bind(...),创建一个新的Channel并绑定
引导负责客户端通道连接或断开连接,因此它将在调用bind(...)或connect(...)后创建通道。下图显示了如何工作:
Channel的实现和EventLoop的处理过程在EventLoopGroup中必须兼容,哪些Channel是和 EventLoopGroup是兼容的可以查看API文档。经验显示,相兼容的实现一般在同一个包下面,例如使用 NioEventLoop,NioEventLoopGroup和NioServerSocketChannel在一起。请注意,这些都是前缀 “Nio”,然后不会用这些代替另一个实现和另一个前缀,如“Oio”,也就是说OioEventLoopGroup和
NioServerSocketChannel是不相容的。
Channel和EventLoopGroup的EventLoop必须相容,例如NioEventLoop、NioEventLoopGroup、 NioServerSocketChannel是相容的,但是OioEventLoopGroup和NioServerSocketChannel是不相容的。从类名可以看出前缀是“Nio”的只能和“Nio”的一起使用,“Oio”前缀的只能和Oio*一起使用,将不相容的一起使用会导致错误异常,如 OioSocketChannel和NioEventLoopGroup一起使用时会抛出异常:Exception
in thread "main" java.lang.IllegalStateException: incompatible event loop type。
ServerBootstrap
下面是ServerBootstrap提供的方法:
• group(...),设置EventLoopGroup事件循环组
• channel(...),设置通道类型
• channelFactory(...),使用ChannelFactory来设置通道类型
• localAddress(...),设置本地地址,也可以通过bind(...)或connect(...)
• option(ChannelOption<T>, T),设置通道选项,若使用null,则删除上一个设置的ChannelOption
• childOption(ChannelOption<T>, T),设置子通道选项
• attr(AttributeKey<T>, T),设置属性到Channel,若值为null,则指定键的属性被删除
• childAttr(AttributeKey<T>, T),设置子通道属性
• handler(ChannelHandler),设置ChannelHandler用于处理请求事件
• childHandler(ChannelHandler),设置子ChannelHandler
• clone(),深度复制ServerBootstrap,且配置相同
• bind(...),创建一个新的Channel并绑定
下图显示ServerBootstrap管理子通道:
child*方法是在子Channel上操作,通过ServerChannel来管理。
在引导过程中通过handler(...)或childHandler(...)都只添加了一个ChannelHandler实例,对于简单的程序可能足够,但是对于复杂的程序则无法满足需求。例如,某个程序必须支持多个协议,如HTTP、WebSocket。若在一个 ChannelHandler中处理这些协议将导致一个庞大而复杂的ChannelHandler。Netty通过添加多个 ChannelHandler,从而使每个ChannelHandler分工明确,结构清晰。
Netty的一个优势是可以在ChannelPipeline中堆叠很多ChannelHandler并且可以最大程度的重用代码。如何添加多个 ChannelHandler呢?Netty提供ChannelInitializer抽象类用来初始化ChannelPipeline中的 ChannelHandler。ChannelInitializer是一个特殊的ChannelHandler,通道被注册到EventLoop后就会 调用ChannelInitializer,并允许将ChannelHandler添加到CHannelPipeline;完成初始化通道后,这个特殊的
ChannelHandler初始化器会从ChannelPipeline中自动删除。
使用通道选项和属性
比较麻烦的是创建通道后不得不手动配置每个通道,为了避免这种情况,Netty提供了ChannelOption来帮助引导配置。这些选项会自动应用到引导创建的所有通道,可用的各种选项可以配置底层连接的详细信息,如通道“keep-alive(保持活跃)”或“timeout(超时)”的特性。
Netty应用程序通常会与组织或公司其他的软件进行集成,在某些情况下,Netty的组件如通道、传递和Netty正常生命周期外使用;在这样的情况下并不是所有的一般属性和数据时可用的。这只是一个例子,但在这样的情况下,Netty提供了通道属性(channel attributes)。
属性可以将数据和通道以一个安全的方式关联,这些属性只是作用于客户端和服务器的通道。例如,例如客户端请求web服务器应用程序,为了跟踪通道属于哪个用户,应用程序可以存储用的ID作为通道的一个属性。任何对象或数据都可以使用属性被关联到一个通道。
使用ChannelOption和属性可以让事情变得很简单,例如Netty WebSocket服务器根据用户自动路由消息,通过使用属性,应用程序能在通道存储用户ID以确定消息应该发送到哪里。应用程序可以通过使用一个通道选 项进一步自动化,给定时间内没有收到消息将自动断开连接。看下面代码:
Netty包含了2个不同类型的引导,第一个是使用服务器的ServerBootstrap,用来接受客户端连接以及为已接受的连接创建子通道;第二个是用于客户端的Bootstrap,不接受新的连接,并且是在父通道类完成一些操作。
还有一种情况是处理DatagramChannel实例,这些用于UDP协议,是无连接的。换句话说,由于UDP的性质,所以当处理UDP数据时没有必要每个连接通道与TCP连接一样。因为通道不需要连接后才能发送数据,UDP是无连接协议。一个通道可以处理所有的数据而不需要依赖子通道。
下图是Bootstrap的类关系图:
为了对客户端和服务器之间的关系提供了一个共同点,Netty使用 AbstractBootstrap类。通过一个共同的父类,使得客户端和服务器的引导程序能够重复使用通用功能,而无需复制代码或逻辑。通常情况下,多个通道使用相同或非常类似的设置时有必要的,而不是为每一个通道创建一个新的引导。Netty使得AbstractBootstrap可复制,也就是说克隆一个已配置的引导,其返回的是一个可重用而无需配置的引导。Netty的克隆操作只能浅拷贝引导的EventLoopGroup,也就是说 EventLoopGroup在所有的克隆的通道中是共享的。这是一个好事情,克隆的通道一般是短暂的,例如一个通道创建一个HTTP请求。
Bootstrap
创建Bootstrap实例使用new关键字,下面是Bootstrap的方法:
• group(...),设置EventLoopGroup,EventLoopGroup用来处理所有通道的IO事件
• channel(...),设置通道类型
• channelFactory(...),使用ChannelFactory来设置通道类型
• localAddress(...),设置本地地址,也可以通过bind(...)或connect(...)
• option(ChannelOption<T>, T),设置通道选项,若使用null,则删除上一个设置的ChannelOption
• attr(AttributeKey<T>, T),设置属性到Channel,若值为null,则指定键的属性被删除
• handler(ChannelHandler),设置ChannelHandler用于处理请求事件
• clone(),深度复制Bootstrap,Bootstrap的配置相同
• remoteAddress(...),设置连接地址
• connect(...),连接远程通道
• bind(...),创建一个新的Channel并绑定
引导负责客户端通道连接或断开连接,因此它将在调用bind(...)或connect(...)后创建通道。下图显示了如何工作:
Channel的实现和EventLoop的处理过程在EventLoopGroup中必须兼容,哪些Channel是和 EventLoopGroup是兼容的可以查看API文档。经验显示,相兼容的实现一般在同一个包下面,例如使用 NioEventLoop,NioEventLoopGroup和NioServerSocketChannel在一起。请注意,这些都是前缀 “Nio”,然后不会用这些代替另一个实现和另一个前缀,如“Oio”,也就是说OioEventLoopGroup和
NioServerSocketChannel是不相容的。
Channel和EventLoopGroup的EventLoop必须相容,例如NioEventLoop、NioEventLoopGroup、 NioServerSocketChannel是相容的,但是OioEventLoopGroup和NioServerSocketChannel是不相容的。从类名可以看出前缀是“Nio”的只能和“Nio”的一起使用,“Oio”前缀的只能和Oio*一起使用,将不相容的一起使用会导致错误异常,如 OioSocketChannel和NioEventLoopGroup一起使用时会抛出异常:Exception
in thread "main" java.lang.IllegalStateException: incompatible event loop type。
ServerBootstrap
下面是ServerBootstrap提供的方法:
• group(...),设置EventLoopGroup事件循环组
• channel(...),设置通道类型
• channelFactory(...),使用ChannelFactory来设置通道类型
• localAddress(...),设置本地地址,也可以通过bind(...)或connect(...)
• option(ChannelOption<T>, T),设置通道选项,若使用null,则删除上一个设置的ChannelOption
• childOption(ChannelOption<T>, T),设置子通道选项
• attr(AttributeKey<T>, T),设置属性到Channel,若值为null,则指定键的属性被删除
• childAttr(AttributeKey<T>, T),设置子通道属性
• handler(ChannelHandler),设置ChannelHandler用于处理请求事件
• childHandler(ChannelHandler),设置子ChannelHandler
• clone(),深度复制ServerBootstrap,且配置相同
• bind(...),创建一个新的Channel并绑定
下图显示ServerBootstrap管理子通道:
child*方法是在子Channel上操作,通过ServerChannel来管理。
在引导过程中通过handler(...)或childHandler(...)都只添加了一个ChannelHandler实例,对于简单的程序可能足够,但是对于复杂的程序则无法满足需求。例如,某个程序必须支持多个协议,如HTTP、WebSocket。若在一个 ChannelHandler中处理这些协议将导致一个庞大而复杂的ChannelHandler。Netty通过添加多个 ChannelHandler,从而使每个ChannelHandler分工明确,结构清晰。
Netty的一个优势是可以在ChannelPipeline中堆叠很多ChannelHandler并且可以最大程度的重用代码。如何添加多个 ChannelHandler呢?Netty提供ChannelInitializer抽象类用来初始化ChannelPipeline中的 ChannelHandler。ChannelInitializer是一个特殊的ChannelHandler,通道被注册到EventLoop后就会 调用ChannelInitializer,并允许将ChannelHandler添加到CHannelPipeline;完成初始化通道后,这个特殊的
ChannelHandler初始化器会从ChannelPipeline中自动删除。
使用通道选项和属性
比较麻烦的是创建通道后不得不手动配置每个通道,为了避免这种情况,Netty提供了ChannelOption来帮助引导配置。这些选项会自动应用到引导创建的所有通道,可用的各种选项可以配置底层连接的详细信息,如通道“keep-alive(保持活跃)”或“timeout(超时)”的特性。
Netty应用程序通常会与组织或公司其他的软件进行集成,在某些情况下,Netty的组件如通道、传递和Netty正常生命周期外使用;在这样的情况下并不是所有的一般属性和数据时可用的。这只是一个例子,但在这样的情况下,Netty提供了通道属性(channel attributes)。
属性可以将数据和通道以一个安全的方式关联,这些属性只是作用于客户端和服务器的通道。例如,例如客户端请求web服务器应用程序,为了跟踪通道属于哪个用户,应用程序可以存储用的ID作为通道的一个属性。任何对象或数据都可以使用属性被关联到一个通道。
使用ChannelOption和属性可以让事情变得很简单,例如Netty WebSocket服务器根据用户自动路由消息,通过使用属性,应用程序能在通道存储用户ID以确定消息应该发送到哪里。应用程序可以通过使用一个通道选 项进一步自动化,给定时间内没有收到消息将自动断开连接。看下面代码:
public static void main(String[] args) { //创建属性键对象 final AttributeKey<Integer> id = AttributeKey.valueOf("ID"); //客户端引导对象 Bootstrap b = new Bootstrap(); //设置EventLoop,设置通道类型 b.group(new NioEventLoopGroup()).channel(NioSocketChannel.class) //设置ChannelHandler .handler(new SimpleChannelInboundHandler<ByteBuf>() { @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { System.out.println("Reveived data"); msg.clear(); } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { //通道注册后执行,获取属性值 Integer idValue = ctx.channel().attr(id).get(); System.out.println(idValue); //do something with the idValue } }); //设置通道选项,在通道注册后或被创建后设置 b.option(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); //设置通道属性 b.attr(id, 123456); ChannelFuture f = b.connect("www.manning.com",80); f.syncUninterruptibly(); }
相关文章推荐
- bootstrap3 兼容IE8浏览器!
- JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)
- Bootstrap 实现输入框中的 x 按钮删除文本值
- bootstrap模态框瞬间消失解决
- 详解Bootstrap列表组组件
- Bootstrap媒体对象的实现
- Bootstrap进度条组件知识详解
- BootStrap glyphicons 字体图标实现方法
- Bootstrap进度条组件知识详解
- Bootstrap媒体对象的实现
- 百度地图显示问题的解决方案(续上篇博客)
- 【一点一滴Bootstrap】导航栏
- 【一点一滴Bootstrap】标签页Tab
- 【一点一滴Bootstrap】模态框
- bootstrap表单验证插件 经验记录 与RSA加密事件配合修改
- 杭州4--30,关于css,bootstrap,url渲染的js语句问题
- bootstrap ch2清除浮动+12
- bootstrap ch2清除浮动
- bootstrap开始咯
- 详解Bootstrap媒体对象