Bootstrap是Netty提供的一个便利的工具类, 通过Bootstrap类能够容易地启动一个客户端使之与服务器端进行通信。
下面的代码用于从服务器中获取时间:
|
|
TimeClientHandler代码如下:
|
|
在TimeClient中创建了一个NioEventLoopGroup对象,它用来处理IO事件。在group中添加了一个TimeClientHandler,在通道准备就绪时会调用channelActive方法向服务器发送QUERY TIME ORDER
;在收到服务器的响应后,会调用channelRead方法,输出服务器返回的时间。
ChannelFuture f = b.connect(host, port).sync();
用于异步连接服务端,我们进入到connect方法,该方法会调用doResolveAndConnect方法:
|
|
如果注册未完成,则创建一个PendingRegistrationPromise类型的对象,并向regFuture对象中添加一个listener,在注册完成后会调用该listener的operationComplete方法。
下面看下doResolveAndConnect0方法:
|
|
该方法主要对地址进行一些检查和解析,然后会调用doConnect方法:
|
|
这里把具体的连接工作放到了channel对应的eventLoop来执行,这方面的内容以后会讲到,现在可以理解为放入一个线程池中执行。
具体的连接操作其实是通过pipeline调用了AbstractNioUnsafe类中的connect方法来执行,这些内容将在以后分析。
我们回过头来看下doResolveAndConnect方法中调用的initAndRegister方法,该方法在AbstractBootstrap中实现:
|
|
该方法很简单,创建了一个Channel对象,然后调用init方法对该对象进行初始化:
|
|
回顾一下在TimeClient中的如下代码:
|
|
init方法就是把上面的option和handler添加到channel中。
至此,整个连接操作算是完成了,以后的通信工作就会交给EventLoop来执行,Bootstrap只是提供了一个启动的工作,主要是进行初始化和连接的操作。