展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

EventLoop组件

  • ChannelHandlerContext
1) 保存 Channel 相关的所有上下文信息,同时关联一个 ChannelHandler 对象
2) 即ChannelHandlerContext 中 包 含 一 个 具 体 的 事 件 处 理 器 ChannelHandler,同 时ChannelHandlerContext 中也绑定了对应的 pipeline 和 Channel 的信息,
方便对 ChannelHandler进行调用
  • 案例
# 在TestHttpServerHandler的channelRead0方法中使用如下方式获取
System.out.println("对应的channel=" + ctx.channel() + " pipeline=" + ctx.pipeline() + 
" 通过pipeline获取channel" + ctx.pipeline().channel());
System.out.println("当前ctx的handler=" + ctx.handler());
  • 常用方法
• ChannelFuture close(),关闭通道
• ChannelOutboundInvoker flush(),刷新
• ChannelFuture writeAndFlush(Object msg) , 将 数 据 写 到 ChannelPipeline 中 当 前
• ChannelHandler 的下一个 ChannelHandler 开始处理(出站)
  • ChannelOption
1) Netty 在创建 Channel 实例后,一般都需要设置 ChannelOption 参数。
2) ChannelOption 参数如下:

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

    ChannelOption.SO_KEEPALIVE:
    一直保持连接活动状态
  • EventLoopGroup 和其实现类 NioEventLoopGroup
1) EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。
2) EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个EventLoop来处理任务。在 Netty 服务器端编程中,我们一般都需要提供两个EventLoopGroup,
例如:BossEventLoopGroup 和 WorkerEventLoopGroup
3) 通常一个服务端口即一个 ServerSocketChannel对应一个Selector 和一个EventLoop线程。BossEventLoop 负责接收客户端的连接并将 SocketChannel 交给WorkerEventLoopGroup 来进行 IO 处理
• BossEventLoopGroup 通常是一个单线程的 EventLoop,EventLoop 维护着一个注册了ServerSocketChannel 的Selector 实例BossEventLoop 不断轮询Selector 将连接事件分离出来
• 通常是 OP_ACCEPT 事件,然后将接收到的 SocketChannel 交给WorkerEventLoopGroup
• WorkerEventLoopGroup 会由 next 选择其中一个 EventLoop来将这个SocketChannel 注册到其维护的Selector 并对其后续的 IO 事件进行处理

  • 常用方法
public NioEventLoopGroup(),构造方法
public Future<?> shutdownGracefully(),断开连接,关闭线程
posted @ 2022-08-08 23:19  DogLeftover  阅读(10)  评论(0编辑  收藏  举报