AbstractBootstrap,为这篇做了个铺垫。
一、概述
Bootstrap 是 Netty 提供的一个便利的工厂类, 我们可以通过它来完成 Netty 的客户端或服务器端的 Netty 初始化.Bootstrap: 用于客户端,只需要一个单独的Channel,来与服务端进行数据交互,对应server端的子Channel。作用职责:EventLoop初始化,channel的注册过程 ,关于pipeline的初始化,handler的添加过程,客户端连接分析。
Netty客户端源码部分
EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) // 注册线程池 .channel(NioSocketChannel.class) // 使用NioSocketChannel来作为连接用的channel类 .handler(new ChannelInitializer<SocketChannel>() { // 绑定连接初始化器 @Override protected void initChannel(SocketChannel ch) throws Exception { //这里放入自定义助手类 ch.pipeline().addLast(new EchoClientHandler()); } }); ChannelFuture cf = b.connect(host, port).sync(); // 异步连接服务器 cf.channel().closeFuture().sync(); // 异步等待关闭连接channel } finally { group.shutdownGracefully().sync(); // 释放线程池资源 } }从上面的客户端代码虽然简单, 但是却展示了 Netty 客户端初始化时所需的所有内容:
1. EventLoopGroup: 不论是服务器端还是客户端, 都必须指定 EventLoopGroup. 在这个例子中, 指定了 NioEventLoopGroup, 表示一个 NIO 的EventLoopGroup. 2. ChannelType: 指定 Channel 的类型. 因为是客户端, 因此使用了 NioSocketChannel. 3. Handler: 设置数据的处理器. 4. 这里的option,提供了一系列的TCP参数下面我们深入代码, 看一下客户端通过 Bootstrap 启动后, 都做了哪些工作.
二、源码分析
1、group(group)
/** * 直接调用父类AbstractBootstrap的方法 */ public B group(EventLoopGroup group) { if (group == null) { throw new NullPointerException("group"); } if (this.group != null) { throw new IllegalStateException("group set already"); } this.group = group; return self(); }直接调用父类的方法 ,说明该EventLoopGroup,作为客户端 Connector 线程,负责注册监听连接操作位,用于判断异步连接结果。
2、channel(NioServerSocketChannel.class)
在 Netty 中, Channel是一个Socket的抽象, 它为用户提供了关于 Socket 状态(是否是连接还是断开) 以及对 Socket 的读写等操作. 每当 Netty 建立了一个连接后, 都会有一个对应的 Channel 实例。
2.1源码
/** * 同样也是直接调用父类AbstractBootstrap的方法 */ public B
