Netty
文章平均质量分 56
ProMan_XY
这个作者很懒,什么都没留下…
展开
-
Netty-面试题(补充)(五十二)
除了解码器之外,Netty 也提供了编码器,用于在发送数据前按照特定规则格式化消息。例如,对于LengthfieldBasedFrameDecoder,可以使用 LengthFieldPrepender 编码器来在消息前添加长度字段。Netty通过预先指定的数据流编解码器,按照预先约定好的规则进行数据的解析,即可解决对应的粘包、拆包问题。针对TCP的粘包、拆包问题,Netty有自己的解决方式。Netty如何解决TCP粘包、拆包的问题的?原创 2024-05-23 17:25:04 · 178 阅读 · 0 评论 -
Netty-面试题(下)(五十一)
Netty 的线程模型并不是一成不变的,它实际取决于用户的启动参数配置。通过设置不同的启动参数,Nettv支持三种模型,分别是Reactor单线程模型、Reactor多线程模型、Reactor主从多线程模型。多路复用就是首先去阻塞的调用系统,询问内核数据是否准备好,,如果准备好,再重新进行系统调用,进行数据拷贝。在解决多线程的问题的时候,锁是最常用的方案,但是也是开销最大的一种方案,同时也会带来死锁的问题,所以,Netty为了避免这些问题引入了无锁化设计。Netty的线程模型是怎么样的。原创 2024-05-23 17:18:42 · 298 阅读 · 0 评论 -
Netty-面试题(中)(五十)
Unpooled.wrappedBuffer 方法可以将不同的数据源的一个或者多个数据包装成一个大的 BvteBuf 对象,其中数据源的类型包括 bytel、ByteBuf、ByteBufer。那么在这种情况下,我们如果直接将两个字节流拷贝到一个新的字节流中,显然会浪费空间和时间,所以Netty推出了CompositeByteBuf,专门用来拷贝ByteBuf。所以,我们发现,假如我们在收发报文的时候使用直接内存,那么就可以减少一次内存拷贝,Netty就是这么做的。关于零拷贝和堆外内存。原创 2024-05-14 10:26:53 · 331 阅读 · 0 评论 -
Netty-面试题(上)(四十九)
相比于Java中自带的NIO来说,Netty有很多好处,比如开箱即用,非常方便;性能高,能承载大量并发;他主要指的是在操作数据时,不需要将数据buffer从 一个内存区域拷贝到另一个内存区域。少了一次内存的拷贝,CPU 效率就得到的提升。Netty 主要用来做网络通信,一般可以用来作RPC框架的通信工具、实现即时通讯系统以及实时消息推送系统等。Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty性能好的原因是什么?Netty的零拷贝是怎么实现的?Netty的零拷贝主要体现在以下。原创 2024-05-14 10:18:56 · 485 阅读 · 0 评论 -
Netty源码 ——EventLoop源码剖析05(四十八)
当selectedKeys不为空,说明有事件需要处理,processSelectedKeysOptimized 是具体处理的逻辑,最终的实现代码如下。processSelectedKeys 的作用是处理事件,例如,连接,接收连接,读,写事件,接下来看源码。processSelectedKeys 实现。原创 2024-04-30 09:15:00 · 456 阅读 · 0 评论 -
Netty源码 ——EventLoop源码剖析04(四十七)
在接着runAllTasks 的执行参数。runAllTask实现。原创 2024-04-30 09:00:00 · 149 阅读 · 0 评论 -
Netty源码 ——EventLoop源码剖析03(四十六)
NioEventLoop 中的 loop 轮询是依靠 run 方法来执行的,在方法中可以看到是一个 for 循环其中三件事情,如下图中EventLoop部分。分析EventLoop中的Run方法,我们进入Run方法,就到了我们之前分析过的NioEventLoop中的run方法,此方法做了三件事情,如下源码。上图不管是bossGroup还是WorkerGroup中的EventLoop都由run方法完成。select 方法实现。原创 2024-04-23 08:45:00 · 600 阅读 · 0 评论 -
Netty源码 ——EventLoop源码剖析02(四十五)
SingleThreadEventExecutor 队列中元素是实现了 Runnable 接口的对象,线程池中最重要的方法当然是 executer 方法,EventLoop 是 SingleThreadEventExecutor 的子类,那么EventLoop 类也可以直接调用 executer 方法来完成对事件的执行,我们来看源码。接着看 addTask 的实现。原创 2024-04-23 08:15:00 · 438 阅读 · 0 评论 -
Netty源码 ——EventLoop源码剖析01(四十四)
使用 netty 包example下 Echo 目录下的案例代码,当我们写一个 NettyServer 时候,第一句话就是 EventLoopGroup bossGroup = new NioEventLoopGroup(1);SingleThreadEventExecutor 也是一个比较重要的类,看源码注释,说明了SingleThreadEventExecutor 是一个单个线程的线程池。分析最核心组件 EventLoop 在 Netty 运行过程中所参与的事情,以及具体实现。原创 2024-04-16 08:45:00 · 426 阅读 · 0 评论 -
Netty 心跳(heartbeat)——服务源码小结(四十三)
ldleStateHandler 可以实现心跳功能,当服务器和客户端没有任何读写交互时,并超过了给定的时间,则会触发用户 handler 的 userEventTriggered 方法。用户可以在这个方法中尝试向对方发送信息,如果发送失败,则关闭连接。 IdleStateHandler 的实现基于 EventLoop 的定时任务,每次读写都会记录一个值,在定时任务运行的时候。通过计算当前时间和设置时间和上次事件发生时间的结果,来判断是否空闲。 内部有 3 个定时任务,分别对应读事件,写事件,读写事件原创 2024-04-16 08:15:00 · 345 阅读 · 0 评论 -
Netty 心跳(heartbeat)——服务源码剖析(下)(四十二)
2)如果读取操作结束了(执行了 channelReadComplete 方法设置) ,就用当前时间减去给定时间和最后一次读(执操作的时间行了 channelReadComplete 方法设置),如果小于 0,就触发事件。5)总的来说,每次读取操作都会记录一个时间,定时任务时间到了,会计算当前时间和最后一次读的时间的间隔,如果间隔超过了设置的时间,就触发 UserEventTriggered 方法。3)这里的时间计算是取读写事件中的最大值来的。然后像写事件一样,判断是否发生了写的慢的情况。原创 2024-04-10 15:44:06 · 586 阅读 · 0 评论 -
Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)
Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务----心跳机制 heartbeat.通过心跳检査对方是否有效,这是 RPC 框架中是必不可少的功能。下面我们分析一下 Netty 内部心跳服务源码实现。只要给定的参数大于 0,就创建一个定时任务,每个事件都创建。如果在指定的事件没有发生读事件,就会抛出这个异常,并自动关闭这个连接。当一个写提作不能在一定的时间内完成时,抛出此异常,并关闭连接,你同样可以在exceptionCaught 方法中处理这个异常。原创 2024-04-10 15:40:43 · 349 阅读 · 0 评论 -
Netty源码剖析——HandlerContext 和调度 handler 梳理(四十)
Pipeline Handler HandlerContext 创建过程梳理。ChannelPipeline 调度 handler 梳理。原创 2024-04-03 08:45:00 · 258 阅读 · 0 评论 -
Netty源码剖析——ChannelPipeline 调度 handler 的源码剖析(三十九)
因为出站是从内部向外面写,从tail 开始,能够让前面的 handler 进行处理,防止 handler 被遗漏,比如编码。反之,入站当然是从 head 往内部输入,让后面的 handler 能够处理这些输入的数据。2)然后,静态方法调用 Context 的 invoker 方法,而 invoker 方法内部会调用该 Context 所包含的Handler 的真正的 XXX 方法,调用结束后,如果还需要继续向后传递,就调用 Context 的 fireXXX2 方法,循环往复。原创 2024-04-02 08:15:00 · 660 阅读 · 0 评论 -
Netty源码剖析——ChannelHandler 创建过程(三十八)
2) 检查这个handler实例是否是共享的,如果不是,并且已经被别的 pipeline 使用了,则抛出异常。调用 newContext(group, filterName(name, handler), handler) 方法,创建一个 Context。5)如果这个通道还没有注册到 selector 上,就将这个 Context 添加到这个 pipeline 的待办任务中。1) pipeline 添加 handler,参数是线程池,name是null,handler是我们或者系统传入的 handler。原创 2024-04-02 07:45:00 · 290 阅读 · 0 评论 -
Netty源码剖析——ChannelHandler 篇(三十六)
ChannelHandler的作用就是处理/拦截IO事件,并将其转发给下一个ChannelHandler。Handler处理事件时分入站和出站的,两个方向的操作都是不同的,因此,Netty 定义了两个子接口继承ChannelHandler。ChannelDuplexHandler 处理出站和入站事件。ChannelOutboundHandler 出站事件接口。ChannelHandler 作用及设计。原创 2024-03-27 07:30:00 · 259 阅读 · 0 评论 -
Netty源码剖析——ChannelHandlerContext 篇(三十七)
ChannelOutboundInvoker 和 ChannelInboundInvoker 部分源码。ChannelHandlerContext 作用及设计。原创 2024-03-27 08:00:00 · 302 阅读 · 0 评论 -
Netty源码剖析——ChannelPipeline篇(三十五)
同时也能遍历内部的链表, 看看他的几个代表性的方法,基本上都是针对 handler 链表的插入,追加,删除,替换操作,类似是一个 LinkedList。可以看到该接口继承了 inBound,outBound,Iterable 接口,表示他可以。业务逻辑处理程序 - 执行实际业务逻辑(例如数据库访问)协议解码器 - 将二进制数据转换为 Java 对象。协议编码器 - 将 Java 对象转换为二进制数据。在 pipeline 的接口文档上,提供了一幅图。pipeline 的接口设计。原创 2024-03-20 08:45:00 · 811 阅读 · 0 评论 -
Netty源码剖析——接受请求过程源码剖析-下(三十四)
最终会调用 doBeginRead 方法,也就是 AbstractNioChannel 类的方法。追踪一下 doReadMessages 方法,就可以看得更清晰。pipeline.fireChannelRead 方法。进入 register 方法查看(步步追会到)回到 read方法,继续分析循环执行的。原创 2024-03-20 08:30:00 · 541 阅读 · 0 评论 -
Netty源码剖析——接受请求过程源码剖析-上(三十三)
3)仍用前面的项目来分析:进入到 NioEventLoop 源码中后,在 private void processSelectedKey(SelectionKey k,AbstractNioChannel ch) 方法开始调试最终我们要分析到AbstractNioChannel 的 doBeginRead 方法,当到这个方法时,针对于这个客户端的连接就完成了,接下来就可以监听读事件。1)从之前服务器启动的源码中,我们得知服务器最终注册了一个 Accept 事件等待客户端的连接。3)处理消息队列中的任务。原创 2024-03-19 08:45:00 · 489 阅读 · 0 评论 -
Netty源码剖析——bind()绑定端口的分析-下(三十二)
3)创建一个 AbstractChanndHandlerContext 对象,ChanndHandlerContext 对象是ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 Pipeline 中时,都会创建Context。Context 的主要功能是管理他所关联的Handler和同一个Pipeline中的其他Handler之间的交互。Init()会调用addLast(),现在进入到 addLast 方法内查看。原创 2024-03-19 08:00:00 · 288 阅读 · 0 评论 -
Netty源码剖析——bind()绑定端口的分析-中(三十一)
4)config().group().register(channel)通过 ServerBootstrap 的 bossGroup 注册 NioServerSocketChannel。1)基本说明: initAndRegister()初始化 NioServerSocketChannel 通道并注册各个handler,返回一个future。2)通过 ServerBootstrap 的通道工厂反射创建一个 NioServerSocketChannel。分析说明 initAndRegister()原创 2024-03-13 09:30:00 · 212 阅读 · 0 评论 -
Netty源码剖析——bind()绑定端口的分析-上(三十)
3.doBind源码里,核心是两个方法 initAndRegister() 和 doBind0()2.Bind()代码,追踪到创建了一个端口对象,并做了一些空判断,核心代码 doBind。1.服务器就是在这个bind()里启动完成的。原创 2024-03-13 08:15:00 · 219 阅读 · 0 评论 -
Netty源码剖析——ServerBootstrap 创建和构造过程(二十九)
ServerBootstrap 是个空构造器,但是有默认的成员变量,底层属性用了LinkedHashMap存ChannelOption和AttributeKey。4)handler 方法传入一个 handler 中,这个hanlder只专属于 ServerSocketChannel 而不是给SocketChannel 用。1)链式调用:group方法,将boss和worker传入,boss 赋值给 parentGroup 属性,worker 赋值给 childGroup。原创 2024-03-12 09:00:00 · 357 阅读 · 0 评论 -
Netty源码剖析——分析NioEventLoopGroup 的过程(二十八)
1)如果 executor是null,创建一个默认的ThreadPerTaskExecutor,使用Netty默认的线程工厂。2)根据传入的线程数(CPU*2)创建一个线程池(单例线程池)数组。3)循环填充数组中的元素。如果异常,则关闭所有的单例线程池。6)将所有的单例线程池添加到一个 HashSet 中。5)为每一个单例线程池添加一个关闭监听器。4)根据线程选择工厂创建一个线程选择器。原创 2024-03-12 07:45:00 · 242 阅读 · 0 评论 -
Netty源码剖析——服务器端处理(二十七)
这是一个普通的处理器类,用于处理客户端发送来的消息,简单的解析出客户端传过来的内容,然后控制台打印,最后发送字符串给客户端。服务器端处理器EchoServerHandler源码。原创 2024-03-05 10:00:00 · 311 阅读 · 0 评论 -
Netty源码剖析——启动过程源码剖析(二十六)
会创建 EventExecutor 数组 children =new EventExecutor(nThreads];//debug -下。随后,变量 b 调用了 group 方法将两个 group 放入了自己的字段中,用于后期引导使用[debug 下 group 方法】在 io.netty.example 包下,有很多Netty源码案例,比较适合分析。demo 源码EchoServer类的基本理解。finally 块中的代码将在服务器关闭时。main 线程阻塞等待关闭。绑定端口并阻塞至连接成功。原创 2024-03-05 09:00:00 · 849 阅读 · 0 评论 -
Netty重点——TCP 粘包和拆包及解决方案下篇(二十五)
按照自定义分隔符符号切割报文: DelimiterBasedFrameDecoder。基于数据包长度切割报文: LengthFieldBasedFrameDecoder。分5次进行解码,每读取到一个Message,会回复一个Message对象给客户端。要求客户端发送5个Message对象,客户端每次发送一个Message对象。按照固定长度切割报文: FixedLenghtFrameDecoder。这些解决方案全被封装到了handler中,我们可以基于Nett。可以利用靠谱的解码器(在其他编解码器中提现过)原创 2024-03-05 08:30:00 · 336 阅读 · 0 评论 -
Netty重点——TCP 粘包和拆包及解决方案上篇(二十四)
时,如果没有做处理,就会发生粘包和拆包的问题。TCP 粘包和拆包基本介绍。TCP粘包和拆包现象实例。原创 2024-02-29 08:45:00 · 318 阅读 · 0 评论 -
Netty重点——编解码器和handler的调用机制下篇(二十三)
应用实例:使用 ReplayingDecoder 编写解码器,对前面的案例进行简化。配置Log4j,在resources/log4j.properties。解码器-ReplayingDecoder(翻译为重播重放)在Maven中添加对Log4j的依赖在pom.xml。Log4j整合到Netty。原创 2024-02-27 09:00:00 · 517 阅读 · 0 评论 -
Netty重点——编解码器和handler的调用机制中篇(二十二)
使用自定义的编码器和解码器来说明 Netty 的 handler 调用机制。handler链的调用机制和规则。服务端发送 long-> 客户端。客户端发送long-> 服务器。本篇干货比较多,请耐心观看~~原创 2024-02-27 08:30:00 · 226 阅读 · 0 评论 -
Netty重点——编解码器和handler的调用机制上篇(二十一)
由于不可能知道远程节点是否会一次性发送一个完整的信息,tcp有可能出现粘包拆包的问题,ByteToMessageDecoder会对入站数据进行缓冲,直到它准备好被处理。编解码器出站入站基本说明。原创 2024-02-20 10:00:00 · 346 阅读 · 0 评论 -
Netty应用——Google Protobuf强化篇(二十)
服务端能接收Student PoJo/ Worker PoJo 对象(需要判断是哪种类型),并显示信息(通过Protobuf解码)客户端可以随机发送Student PoJo/ Worker PoJo 对象到服务器(通过 Protobuf 编码)客户端可以发送一个 Student PoJo 对象到服务器 (通过 Protobuf 编码)服务端能接收 Student PoJo 对象,并显示信息(通过 Protobuf 解码)原创 2024-02-20 09:30:00 · 218 阅读 · 0 评论 -
Netty核心——Google Protobuf篇(十九)
Netty本身的编码解码的机制和问题分析。编码和解码的基本介绍。原创 2024-02-20 08:30:00 · 386 阅读 · 0 评论 -
Netty应用——通过WebSocket编程实现服务器和客户端长连接(十八)
客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务器会感知。Http协议是无状态的,浏览器和服务器间的请求响应一次,下一次会重新创建连接。p协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器。要求:实现基于webSocket的长连接的全双工的交互。原创 2024-02-13 11:15:00 · 382 阅读 · 0 评论 -
Netty应用——心跳检测机制案例(十七)
Netty心跳检测机制案例原创 2024-02-13 10:45:00 · 343 阅读 · 0 评论 -
Netty应用——实例-群聊系统(十六)
Netty应用实例-群聊系统原创 2024-02-13 10:00:00 · 397 阅读 · 0 评论 -
Netty重点——ByteBuf特别篇(十五)
bytebuf原创 2024-02-06 09:53:58 · 251 阅读 · 0 评论 -
Netty重点——核心组件补充篇(十四)
shutdownGracefully(),断开连接,关闭线程。EventLoopGroup和其实现类NioEventLoopGroup。举例说明Unpooled获取Netty的。操作缓冲区的工具类Unpooled。容器ByteBuf的基本使用。原创 2024-02-06 09:15:00 · 328 阅读 · 0 评论 -
Netty重点——核心组件下篇(十三)
Pipeline和ChannelPipeline。ChannelHandler及其实现类。原创 2024-02-06 08:45:00 · 686 阅读 · 0 评论