netty
文章平均质量分 76
曹朋羽
学无止境
展开
-
netty实现websocket通信
websocket是基于http的,所以server端在上一篇实现http协议服务基础上在pipeline里再添加一个WebSocketServerProtocolHandler处理器即可。WebSocketServerProtocolHandler需要指定一个路径参数,用来客户端连接使用。原创 2023-12-08 10:08:28 · 497 阅读 · 0 评论 -
netty实现http协议服务
这里整个处理下来搭建一个完整的http服务还是有许多东西要考虑的,不如直接使用现有的web容器,这里仅仅是为了演示,也为下一篇说websocket做准备。这里收到消息经过前面两个handler处理后类型是FullHttpRequest,在channelRead0方法里构造了一个简单的FullHttpResponse对象,返回数据给客户端。这里要注意文件的大小,还记得最开始添加的报文聚合handler:HttpObjectAggregator,如果超过了这个指定的大小会直接返回414错误。原创 2023-11-29 16:23:53 · 423 阅读 · 0 评论 -
netty报文解析之粘包半包问题
基本上LengthFieldBasedFrameDecoder解码器已经满足解决报文粘包问题,如果还有其它比较复杂的报文,可以自定义协议报文格式进行处理,一个基本原则还是要有一个报文长度标识,然后按具体长度进行读取。原创 2023-09-22 14:37:42 · 166 阅读 · 0 评论 -
netty之数据读写源码阅读
由于我们当前调用write的线程是业务线程,executor.inEventLoop()这一步判断(判断当前线程和NioEventLoop线程池中的线程是否是同一个线程)是不成立的,所以会走else,构造一个task添加到taskQueue里。这里和write方法是相似的,也是MASK_FLUSH匹配的outbound然后递归调用invokeFlush方法,这里最终会调到handler的flush方法。也是调用当前handler的invokeWrite或invokeWriteAndFlush方法。原创 2023-09-21 09:10:14 · 86 阅读 · 0 评论 -
netty数据缓冲区之ChannelOutboundBuffer
发送数据会先被缓存在ChannelOutboundBuffer类中。该类有一个Entry内部类,每次调用write写数据会构造一个Entry放入Buffer类中。使用链表结构进行存储多个Entry,每次加入到链表tail。Entry的创建使用了对象池进行循环使用。原创 2023-09-20 14:27:06 · 126 阅读 · 0 评论 -
netty之ObjectPool(对象池)
对象池和我们的连接池一样就是对象放入一个池中循环使用。特别是在netty创建ByteBuf的时候buf循环使用大大减小了频繁创建对象,垃圾收集的压力。特别是在使用直接内存的时候。netty的对象池对象 RecyclerObjectPool extends ObjectPool。RecyclerObjectPool只是外层抽象,实际对象池由其内部的Recycler对象来维护管理。对象池有两个重要操作对象的获取和回收,下面就从Recycler看起对象池。原创 2023-09-20 10:12:33 · 176 阅读 · 0 评论 -
netty server端启动源码阅读分析
服务端的启动通过ServerBootstrap类来完成,ServerBootstrap内有以下主要属性group()方法就是设置两个线程组属性。channel()方法会new ReflectiveChannelFactory()的工厂赋值给channelFactory属性。childHandler()设置childHandler属性。另外还有一个重要的内部类ServerBootstrapAcceptor,原创 2023-09-19 09:08:59 · 60 阅读 · 0 评论 -
netty之ByteBuf
readerIndex用来标识当前读取位置,当从 ByteBuf 读取时,它的 readerIndex 将会被递增已经被读取的字节数。这里看到默认会读取io.netty.allocator.type配置,如果未设置,判断系统是否是Android,是的化unpooled非池化,否则pooled池化。如果是堆内存,可以buf.array()获取数据数组,通过buf.hasArray()可以判断是否有数组,间接的可以通过该方法判断是堆内存还是堆外内存。因为buf的创建特别是堆外内存的创建还是相对来说耗时一些。原创 2023-09-18 17:26:23 · 122 阅读 · 0 评论 -
netty之pipeline
Netty抽象出流水线(pipeline)这一层数据结构进行处理或拦截channel相关事件。事件分为入站事件(inBound event)和出站事件(outBound event)的ChannelHandlers列表。ChannelPipeline使用先进的Intercepting Filter模式,使用户可以完全控制如何处理事件以及管道中的ChannelHandlers如何相互交互。类似与servlet的filter,亦或是Linux的管道命令,使用责任链模式。原创 2023-09-18 10:58:57 · 76 阅读 · 0 评论 -
netty 线程组
EventExecutor[] children 元素实例类型是NioEventLoop。是一个线程池实现类。其内部有一个EventExecutor类型的数组用来存储所有的线程组。executor是ThreadPerTaskExecutor类型,其execute方法就是创建一个线程执行runnable参数任务。newChild方法就是创建一个NioEventLoop实例,设置executor。NioEventLoop是一个很重要的类,很多事件逻辑都是在该类中完成。下面是NioEventLoop类主要方法。原创 2023-09-15 15:17:07 · 172 阅读 · 0 评论 -
netty入门例子
线程组的创建通过NioEventLoopGroup类,可以入参指定线程组内child数量,不指定会根据当前机器的CPU进行计算child数量。BossGroup:负责创建serverchannel,并且处理client连接事件,也就是accept事件。开发只需要按照netty提供的api方法,相对繁琐nio使开发变的相对简单很多。线程组内监听到Selector事件都会交由channel绑定的pipeline进行处理。workGroup:负责监听已绑定channel连接的读写事件。原创 2023-09-15 11:18:37 · 64 阅读 · 0 评论