ServerBootstrap常用方法和ChannelFuture接口

ServerBootstrap的常用方法

  • 该类算是一种容器类,它主要存放服务器的配置项和处理器(Executor)等信息。
  • 它可以视为一个包含各种设置和组件的数据结构,用于组织、管理、拓展服务器的相关功能。其中包括线程模型、传输协议、选项配置、ServerSocketChannel实例等。

group(parentGroup, childGroup)方法

  • 一个接收连接,一个处理客户端channel。

    • 所以,可以明了,handler和childHandler这两个方法作用点是什么了。
    • 这两个EventLoopGroup用于处理ServerChannel和Channel的所有事件和IO。
  • 该方法就是给该类的成员变量赋值。

channel(channelClass)方法

  • 传入的是类型是Channel
    • ServerSocketChannel表示一个可以监听并接受客户端连接的通道,即服务端的通道。
    • SocketChannel表示具体的客户端通道。
  • 也只是将class传入ChannelFactory

    • 只有在调用bind()方法时才会实例化Channel。
    • 但是会提前准备好实例Channel的工厂。
  • 传入的是参数class,显然后面要通过反射实例化。

childHandler(childHandler)

  • 设置用于为Channel的请求提供服务的ChannelHandler。
  • 那么handler()方法一般就是用于ServerChannel。

bind()方法

  • 主要是初始化Channel,绑定端口号之类的,如果是服务端就是ServerSocketChannel,客户端就是SocketChannel之类的。
    serverBootstrap.channel(NioServerSocketChannel.class)//实例化NioServerSocketChannel
    复制代码
  • 通过反射,最终会调用如下构造方法:

  • 将Channel设置成非阻塞模式

  • 和原生的NIO大同小异:
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.configureBlocking(false);
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);//一般以连接事件为起源
    复制代码
  • Netty中的Channel还有其他内容:

  • 最后,绑定工作交由EventLoop去执行:

    • ChannelPromise 接口继承了 ChannelFuture 接口,它提供了一些额外的方法,用于设置异步操作的结果。例如,可以使用 setSuccess() 方法将异步操作标记为成功,或使用 setFailure() 方法将异步操作标记为失败。

ChannelFuture

增强版的Future

  • JDK自带Future有些瑕疵,比如:

    • 返回true的情况太宽泛和模棱两可了。
  • 所以Netty又它加了一些任务状态的判断:

和Channel相关的Future

  • Channel主要表示IO操作的通道,势必会产生很多I/O操作,所以让I/O异步执行的情况下还需要知道执行的情况,所以该类提供了如下几种更为详细的状态:

  • 在Netty中,ChannelFuture是异步操作的结果对象,它表示一个I/O操作的未来结果。当执行一个I/O操作时,Netty会返回一个ChannelFuture对象,这个对象包含了该I/O操作的状态信息和结果。通过ChannelFuture对象,我们可以了解到I/O操作是否成功,如果操作失败,可以获取相应的 错误信息。
  • 同时,我们也可以通过ChannelFuture对象注册监听器,在I/O操作完成时获得通知,以便我们可以及时地处理操作结果。

  • sync() 和 await() 方法:
    • sync() 方法会阻塞当前线程,直到操作完成。而 await() 方法也会阻塞当前线程,但可以通过传递一个超时参数来设置等待的最长时间。
    • 实际上,sync() 和 await() 方法之间的主要区别在于它们的语义。sync() 方法表示您希望同步等待操作完成,而 await() 方法表示您希望等待操作完成,但可能会在等待过程中被中断。在不传递超时参数的情况下,它们的行为确实非常相似。
    ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();  
    ChannelFuture channelFuture = serverBootstrap.bind(8899).await();
    //区别不大
    复制代码
  • 文档提示:Do not confuse I/O timeout and await timeout:
    • I/O 超时是指在进行 I/O 操作时,如果在指定的时间内没有收到响应,就会抛出一个超时异常。例如,在进行网络连接时,如果在指定的时间内无法连接到远程主机,就会抛出一个连接超时异常。I/O 超时通常由底层的操作系统或网络库实现,Netty 只是将其封装在 ChannelFuture 中,以便可以在操作完成后检查是否发生了超时。
    • await 超时是指在等待 ChannelFuture 完成时,如果在指定的时间内未完成,就会抛出一个超时异常。例如,在等待一个 I/O 操作完成时,如果在指定的时间内未完成,就会抛出一个超时异常。这种超时是由 Netty 实现的,它允许您在等待操作完成时设置一个超时时间,以避免无限期地等待。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值