netty学习笔记(一)

netty

netty入门

服务端

ServerBootstrap() : 启动器,负责组装netty组件,启动服务器

NioEventLoopGroup() : EventLoop是一个selector加上一个thread就是一个eventloop,即循环处理可读可写事件,既然是group就是组的意思,里面有BossEventLoop和WorkerEventLoop,分别处理accept和读写的事件

NioServerSocketChannel() : 选择服务器ServerSocketChannel的实现,OIO,BIO

childHandle:决定了worker(child)能做哪些事情

channelInitializer:channel代表和客户端进行数据读写的通道, Initializer初始化,负责添加别的handler

StringDecoder():将ByteBuf进行解码,转换成字符串

ChannelInboundHandleAdapter:自定义handler

bind:绑定监听端口

客户端

Bootstrap() : 启动类

StringEncoder() : 编码器

connect:链接哪个服务器

sync():阻塞方法,直到连接建立

writeAndFlush():向服务器发送数据

channel:就像数据的通道

msg:流动的数据

handle:数据的处理工序

pipeline:工序有多道,就是流水线

handle分为Inbound 和 Outbound,入站和出站

eventloop:干活的工人,处理数据

  1. 工人可以管理多个channel 的 io操作,且一个工人只要负责了一个channel,就会绑定,负责到底

  2. 一个工人既可以处理io操作,也可以处理普通任务

  3. 工人按照pipeline的顺序,按序执行handle

组件

EventLoop

事件循环对象

eventloop本质上是一个单线程执行器(同时维护了一个selector),里面有run方法源源不断地处理Channel里面的IO事件

由于它继承过一个线程池的类,因此包含所有的线程池的方法

并且还包含判断当前线程是否属于此EventLoop的方法和查看自己属于哪个EventLoopGroup

事件循环组

EventLoopGroup是一组EventLoop,Channel会调用EventLoopGroup中的register方法来绑定其中一个eventloop,后续这个channel的IO事件都由此Eventloop执行(保证了IO的线程安全)

如何实现handle换人,源码分析

static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) { final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next); // 下一个handle的事件循环是否和这个事件循环是一个线程

EventExecutor executor = next.executor();//返回下一个handle的eventLoop

// 是,直接调用 if (executor.inEventLoop()) { ​ next.invokeChannelRead(m); ​ }

// 不是,将要执行的代码作为任务提交给下一个事件循环处理

else { executor.execute(new Runnable() { // 如果是外部线程,则提交给异步任务队列 @Override public void run() { next.invokeChannelRead(m); } }); } }

channel

channel的主要作用:

  1. close()关闭chanel

  2. closeFuture()处理channel的关闭

{

如果想要在关闭channel后执行一些操作会发现一个问题,那就是因为close方法也是异步调用的方法, 这就导致了,写在close方法后的操作不是在真正关闭后执行的,因为close异步的,执行close后会立马 执行之后的代码,达不到想要的效果,因此我们需要用closedFuture对象,调用sync方法解决

}

其中sync():同步等待channel关闭

{

如果不适用sync方法会出现问题,因为connect方法是异步非阻塞的,main线程调用了connect, 但是实际执行connect的是nio线程,没有sync方法,main方法直接去准备拿channel了,但是那时 候connect还没执行完,sync会阻塞当前线程,直到nio线程执行完毕

}

addlistener:异步等待channel关闭

  1. pipeline()添加处理器

  2. write:写入数据

  3. writeAndFlush:将数据写入并刷出

*带有future,promise的类型都是和 异步方法配套使用的

*异步提升的是吞吐量而不是缩短响应时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值