1.概述
上一篇文章我们虽然写的是AbstractBootStrap的一些方法,但是我们主要分析的还是ServerBootStrap的启动,那我这篇文章的话还是继续看AbstractBootStrap的另一个子类BootStrap的启动。
我们先看下netty客户端的demo代码,如下:
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(new NettyClientHandler());
}
});
ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 50070).sync();
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
2.Bootstrap
2.1构造函数
构造函数这块感觉没有什么特殊的逻辑,就是一个比较简单的无参构造函数和有参构造函数。
//无参构造函数
public Bootstrap() { }
//有参的构造函数
private Bootstrap(Bootstrap bootstrap) {
super(bootstrap);
// 地址解析器对象的赋值
resolver = bootstrap.resolver;
// 远程连接地址的赋值
remoteAddress = bootstrap.remoteAddress;
}
看到有参构造函数给resolver 和remoteAddress这两个属性进行了一个赋值的操作,就好奇看下了,感觉这个resolver应该会有一个默认的地址解析器 DEFAULT_RESOLVER
//默认的地址解析器
private static final AddressResolverGroup<?> DEFAULT_RESOLVER = DefaultAddressResolverGroup.INSTANCE;
public Bootstrap resolver(AddressResolverGroup<?> resolver) {
this.resolver = (AddressResolverGroup<SocketAddress>) (resolver == null ? DEFAULT_RESOLVER : resolver);
return this;
}
2.2 channel方法
在上面使用的示例中接下来我们进行使用了channel方法,感觉跟ServerBootStrap的channel方法一样,没什么特殊。也是直接进行调用父类AbstractBootstrap的channel方法。下面的option方法和handler方法也是同样的,这里就不再多赘述。
public B channel(Class<? extends C> channelClass) {
return channelFactory(new ReflectiveChannelFactory<C>(
ObjectUtil.checkNotNull(channelClass, "channelClass")
));
}
2.3 connect方法
我们继续看就看到了一个重要的方法,connect方法,这个方法进行连接服务器的操作,是一个核心的方法。
public ChannelFuture connect(String inetHost, int inetPort) {
return connect(InetSocketAddress.createUnresolved(inetHost, inetPort));
}
/**
* Connect a {@link Channel} to the remote peer.
*/
public ChannelFuture connect(InetAddress inetHost, int inetPort) {
return connect(new InetSocketAddress(inetHost, inetPort));
}
/**
* Connect a {@link Channel} to the remote peer.
*/
//多个重载的方法 最终都会