前言 动机 最近在学习Netty框架,发现Netty是支持Http协议的。加上以前看过Spring-MVC的源码,就想着二者能不能结合一下,整一个简易的web框架(PS:其实不是整,是抄) 效果 项目地址:terabithia 0.3版本使用效果如下,其实就是Spring-MVC的Controller的写法 @RestController @RequestMapping(value = "/hello") public class HelloController { /** * request url:/hello…

2022年6月21日 0条评论 395点热度 2人点赞 王谷雨 阅读全文

效果 ProtobufVarint32LengthFieldPrepender编码器用于在数据最前面添加Varint32,表示数据长度 ProtobufVarint32FrameDecoder是相对应的解码器 Varint32 讲编码器之前,先来讲讲什么是VarInt32(vary int 32),即:可变长的int 在java里,int的长度固定为 4 byte,即 32 bits,最高位为符号位。 而Varint32则不固定长度,最小 1 byte,最大 5 byte,每个byte的最高位如果为1表示下一个by…

2022年6月16日 0条评论 503点热度 0人点赞 王谷雨 阅读全文

读写Channel(READ)的创建和注册 在NioEventLoop#run中提到,当有IO事件时,会调用processSelectedKeys方法来处理。 当客户端连接服务端,会触发服务端的ACCEPT事件,创建负责READ事件的channel并注册到workerGroup中 跟踪processSelectedKeys的调用 NioEventLoop#processSelectedKeys() --> NioEventLoop#processSelectedKeysOptimized() --> N…

2022年6月16日 0条评论 337点热度 0人点赞 王谷雨 阅读全文

先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,跟踪进去看看 // 类SingleThreadEventExecutor SingleThreadEventExecutor#execute(Runnable task) --> SingleThreadEventExecutor#execute0(@Schedule Runnable task) --> private vo…

2022年6月16日 0条评论 367点热度 1人点赞 王谷雨 阅读全文

简单Echo案例 注释版代码地址:netty 代码是netty的源码,我添加了自己理解的中文注释。 了解了Netty的线程模型和组件之后,我们先看看如何写一个简单的Echo案例,后续的源码讲解都基于此案例。以下是服务端的代码: public final class MyEchoServer { static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); public static …

2022年6月16日 0条评论 286点热度 0人点赞 王谷雨 阅读全文

前置条件 源码版本netty4.1 了解Java NIO、Reactor模型和Netty的基本使用。 解释一下: Java NIO:了解BIO和NIO的区别以及Java NIO基础API的使用 Reactor模型:Netty是基于Netty模型对Java NIO封装的框架 Netty的基本使用:先学会基本使用再看源码,这样可以带着看源码,事半功倍(这个api为啥这么样设计,这个对象又是在什么时候生成的巴拉巴拉) Netty中的Reactor模型 Netty的线程模型参考了Reactor主从多线程模型,但又不完全一样…

2022年6月16日 0条评论 329点热度 0人点赞 王谷雨 阅读全文