菜鸡学习netty源码(二)——BootStrap启动

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.
     */
    //多个重载的方法 最终都会
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小园子的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值