引导

批注 2020-07-09 112728

Bootstrap

  • 客户端

名  称

描  述

Bootstrap group(EventLoopGroup)

设置用于处理 Channel 所有事件的 EventLoopGroup

Bootstrap channel(
Class < ? extends C > )
Bootstrap channelFactory(
ChannelFactory < ? extends C > )

channel() 方法指定了 Channel 的实现类。如果该实现类没提供默认的构造函数 [7] ,可以通过调用 channel- Factory() 方法来指定一个工厂类,它将会被 bind() 方法调用

Bootstrap localAddress(
SocketAddress)

指定 Channel 应该绑定到的本地地址。如果没有指定,则将由操作系统创建一个随机的地址。或者,也可以通过 bind() 或者 connect() 方法指定 localAddress

< T > Bootstrap option(
ChannelOption < T > option,
T value)

设置 ChannelOption ,其将被应用到每个新创建的 Channel ChannelConfig 。这些选项将会通过 bind() 或者 connect() 方法设置到 Channel ,不管哪个先被调用。这个方法在 Channel 已经被创建后再调用将不会有任何的效果。支持的 ChannelOption 取决于使用的 Channel 类型。参见8.6节以及 ChannelConfig 的API文档,了解所使用的 Channel 类型

< T > Bootstrap attr(
Attribute < T > key, T value)

指定新创建的 Channel 的属性值。这些属性值是通过 bind() 或者 connect() 方法设置到 Channel 的,具体取决于谁最先被调用。这个方法在 Channel 被创建后将不会有任何的效果。参见8.6节

Bootstrap handler(ChannelHandler)

设置将被添加到 ChannelPipeline 以接收事件通知的 ChannelHandler

Bootstrap clone()

创建一个当前 Bootstrap 的克隆,其具有和原始的 Bootstrap 相同的设置信息

Bootstrap remoteAddress(   SocketAddress)

设置远程地址。或者,也可以通过 connect() 方法来指定它

ChannelFuture connect()

连接到远程节点并返回一个 ChannelFuture ,其将会在连接操作完成后接收到通知

ChannelFuture bind()

绑定 Channel 并返回一个 ChannelFuture ,其将会在绑定操作完成后接收到通知,在那之后必须调用 Channel. connect() 方法来建立连接

String host = "127.0.0.1";
int port = 1234;
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
    Bootstrap b = new Bootstrap();
    // 指定线程工作池
    b.group(workerGroup);
    // 指定实例化channel的方式
    b.channel(NioSocketChannel.class);
    // 连接参数
    b.option(ChannelOption.SO_KEEPALIVE, true);
    b.handler(new ChannelInitializer<SocketChannel>() {
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new TimeClientHandler());
        }
    });

    // Start the client.
    ChannelFuture f = b.connect(host, port).sync(); // (5)

    // Wait until the connection is closed.
    f.channel().closeFuture().sync();
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    workerGroup.shutdownGracefully();
}

ServerBootStrap

  • 服务端

名  称

描  述

group

设置 ServerBootstrap 要用的 EventLoopGroup 。这个 EventLoopGroup 将用于 ServerChannel 和被接受的子 Channel 的I/O处理

channel

设置将要被实例化的 ServerChannel

channelFactory

如果不能通过默认的构造函数 [8] 创建 Channel ,那么可以提供一个 Channel- Factory

localAddress

指定 ServerChannel 应该绑定到的本地地址。如果没有指定,则将由操作系统使用一个随机地址。或者,可以通过 bind() 方法来指定该 localAddress

option

指定要应用到新创建的 ServerChannel ChannelConfig Channel- Option 。这些选项将会通过 bind() 方法设置到 Channel 。在 bind() 方法被调用之后,设置或者改变 ChannelOption 都不会有任何的效果。所支持的 ChannelOption 取决于所使用的 Channel 类型。参见正在使用的 ChannelConfig 的API文档

childOption

指定当子 Channel 被接受时,应用到子 Channel ChannelConfig ChannelOption 。所支持的 ChannelOption 取决于所使用的 Channel 的类型。参见正在使用的 ChannelConfig 的API文档

attr

指定 ServerChannel 上的属性,属性将会通过 bind() 方法设置给 Channel 。在调用 bind() 方法之后改变它们将不会有任何的效果

childAttr

将属性设置给已经被接受的子 Channel 。接下来的调用将不会有任何的效果

handler

设置被添加到 ServerChannel ChannelPipeline 中的 ChannelHandler 。更加常用的方法参见 childHandler()

childHandler

设置将被添加到已被接受的子 Channel ChannelPipeline 中的 Channel- Handler handler() 方法和 childHandler() 方法之间的区别是:前者所添加的 ChannelHandler 由接受子 Channel ServerChannel 处理,而 childHandler() 方法所添加的 ChannelHandler 将由已被接受的子 Channel 处理,其代表一个绑定到远程节点的套接字

clone

克隆一个设置和原始的 ServerBootstrap 相同的 ServerBootstrap

bind

绑定 ServerChannel 并且返回一个 ChannelFuture ,其将会在绑定操作完成后收到通知(带着成功或者失败的结果)

// 接收到来的连接
EventLoopGroup bossGroup = new NioEventLoopGroup();
// 处理已建立连接的流量
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    // 复制启动服务器
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
            // 使用 NioServerSocketChannel 将到来的连接实例化为Channel
            .channel(NioServerSocketChannel.class)
            // 指定处理器来处理 channel 与 channel 的事件
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new DiscardServerHandler());
                }
            })
            // 指定一些参数(针对到来的连接)
            .option(ChannelOption.SO_BACKLOG, 128)
            // 指定一些参数(针对channel)
            .childOption(ChannelOption.SO_KEEPALIVE, true);

    // Bind and start to accept incoming connections.
    ChannelFuture f = b.bind(port).sync();

    // Wait until the server socket is closed.
    // In this example, this does not happen, but you can do that to gracefully
    // shut down your server.
    f.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}

尽可能重用 EventLoop , 减少先创创建所带来的的开销

ChannelOption

bootstrap.option(ChannelOption.SO_KEEPALIVE,true)
  .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
  • ChannelOption.SO_BACKLOG

ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int socketfd,int backlog)用来初始化服务端可连接队列,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小

  • ChannelOption.SO_KEEPALIVE

Channeloption.SO_KEEPALIVE参数对应于套接字选项中的SO_KEEPALIVE,该参数用于设置TCP连接,当设置该选项以后,连接会测试链接的状态,这个选项用于可能长时间没有数据交流的连接。当设置该选项以后,如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文

关闭

Future<?> future = group.shutdownGracefully();  ← --  shutdownGracefully()方法将释放所有的资源,并且关闭所有的当前正在使用中的Channel
// block until the group has shutdown
future.syncUninterruptibly();

results matching " "

No results matching " "

results matching " "

No results matching " "