自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

geminigoth的博客

夫唯不争,故天下莫能与之争

  • 博客(163)
  • 收藏
  • 关注

原创 Netty学习——实战篇9 实现dubbo RPC 备份

模仿dubbo,消费者和提供者约定接口和协议,消费者远程调用提供者,提供者返回一个字符串,消费者打印提供者返回的数据。底层网络通信使用 Netty 4.X。

2024-04-25 15:00:00 121

原创 Netty学习——实战篇9 实现dubbo RPC

模仿dubbo,消费者和提供者约定接口和协议,消费者远程调用提供者,提供者返回一个字符串,消费者打印提供者返回的数据。底层网络通信使用 Netty 4.X。

2024-04-25 10:00:00 441

原创 Netty学习——实战篇8 Handler链调用、TCP粘包和拆包 备份

/长度//内容@[email protected]("MyMessageEncoder 的 encode 方法被调用");/*自定义解码器,把二进制字节码转换成 MessageProtocol对象*/@[email protected]("MyMessageDecoder 的 decode方法被调用");//封装成MessageProtocol对象//把 MessageProtocol对象放入list中。

2024-04-24 14:30:00 781

原创 Netty学习——实战篇8 Handler链调用、TCP粘包和拆包

/长度//内容@[email protected]("MyMessageEncoder 的 encode 方法被调用");/*自定义解码器,把二进制字节码转换成 MessageProtocol对象*/@[email protected]("MyMessageDecoder 的 decode方法被调用");//封装成MessageProtocol对象//把 MessageProtocol对象放入list中。

2024-04-24 10:00:00 1116

原创 Netty学习——实战篇7 ProtoBuf实战-多类型数据 备份

1、客户端可以随机发送Student POJO 、Worker POJO 对象到服务器(通过protobuf编码)2、服务端能接收 Student POJO 、Worker POJO 对象(需要判断是哪种类型),并显示信息(通过ProtoBuf解码)

2024-04-23 14:30:00 533

原创 Netty学习——实战篇7 ProtoBuf实战-多类型数据

1、客户端可以随机发送Student POJO 、Worker POJO 对象到服务器(通过protobuf编码)2、服务端能接收 Student POJO 、Worker POJO 对象(需要判断是哪种类型),并显示信息(通过ProtoBuf解码)

2024-04-23 10:00:00 491

原创 Netty学习——实战篇6 ProtoBuf实战-单类型数据 备份

编程程序,使用ProtoBuf完成如下功能1、客户端发送一个Student POJO对象到服务器(通过ProtoBuf编码)2、服务端能接收Student POJO对象,并显示信息(通过ProtoBuf解码)

2024-04-22 15:00:00 225

原创 Netty学习——实战篇6 ProtoBuf实战-单类型数据

编程程序,使用ProtoBuf完成如下功能1、客户端发送一个Student POJO对象到服务器(通过ProtoBuf编码)2、服务端能接收Student POJO对象,并显示信息(通过ProtoBuf解码)

2024-04-22 10:00:00 861

原创 Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程 备份

MyServer.javaMyServerHandler.java NettyChatClient.java NettyChatClientHandler.java服务端运行结果: (1)Http协议是无状态的,浏览器和服务器之间的请求响应一次,下一次会重新创建连接。 (2)实现基于webSocket的长连接的全双工的交互。 (3)改变Http协议多次请求的约束,实现长连接,服务端可以发送消息给浏览

2024-04-18 15:00:00 332

原创 Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程

(4)客户端浏览器和服务端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务端也会感知。(1)Http协议是无状态的,浏览器和服务器之间的请求响应一次,下一次会重新创建连接。(3)改变Http协议多次请求的约束,实现长连接,服务端可以发送消息给浏览器。自定义Handler:MyTextWebSocketFrameHandler.java。(2)实现基于webSocket的长连接的全双工的交互。服务端代码:MyServer.java。客户端代码:hello.html。

2024-04-18 10:00:00 683

原创 Netty学习——实战篇4 Netty开发Http服务实战、ByteBuf使用、开发群聊系统 备份

(1)Netty服务器监听8000端口,浏览器发出请求“http://localhost:8000”(2)服务器可以回复消息给客户端,“你好,我是服务器”,并对特定请求资源进行过滤。

2024-04-17 15:15:00 234

原创 Netty学习——实战篇4 Netty开发Http服务实战、ByteBuf使用、开发群聊系统

(1)Netty服务器监听8000端口,浏览器发出请求“http://localhost:8000”(2)服务器可以回复消息给客户端,“你好,我是服务器”,并对特定请求资源进行过滤。

2024-04-17 10:15:00 987

原创 Netty学习——实战篇3 BIO与NIO零拷贝 和 Netty入门实战 备份

【代码】Netty学习——实战篇3 BIO与NIO零拷贝 和 Netty入门实战 备份。

2024-04-16 15:15:00 227

原创 Netty学习——实战篇3 BIO与NIO零拷贝 和 Netty入门实战

【代码】Netty学习——实战篇3 BIO与NIO零拷贝 和 Netty入门实战。

2024-04-16 10:00:00 225

原创 Netty学习——实战篇2 NIO 群聊系统(简单版) 备份

log.info("用户,{}",socketChannel.getRemoteAddress(),"已上线");log.info("来自客户端:{}, 的消息是:{}",socketChannel.getRemoteAddress(),msg);log.info("{}",socketChannel.getRemoteAddress(),":已下线");//log.info("用户:{},说:{}",username,message);log.info("{},客户端初始化完成",username);

2024-04-15 15:15:00 585

原创 Netty学习——实战篇2 NIO 群聊系统(简单版)

log.info("用户,{}",socketChannel.getRemoteAddress(),"已上线");log.info("来自客户端:{}, 的消息是:{}",socketChannel.getRemoteAddress(),msg);log.info("{}",socketChannel.getRemoteAddress(),":已下线");//log.info("用户:{},说:{}",username,message);log.info("{},客户端初始化完成",username);

2024-04-15 10:30:00 1173

原创 Netty学习——实战篇1 BIO、NIO入门demo 备注

运行结果。

2024-04-11 15:42:22 968

原创 Netty学习——实战篇1 BIO、NIO入门demo

运行结果。

2024-04-11 10:00:00 1197

原创 Netty学习——高级篇2 Netty解码技术 备份

本章继续介绍Netty的其他解码器。

2024-04-10 15:00:00 919

原创 Netty学习——高级篇2 Netty解码技术

本章继续介绍Netty的其他解码器。

2024-04-10 10:00:00 888

原创 Netty学习——高级篇1 拆包 、粘包与编解码技术 备份

当Server在读取客户端数据的时候,如果一次读取不完整,就会触发channelRead事件,那么Netty是如何处理这类问题的?本节会详细讲解。

2024-04-09 15:00:00 820

原创 Netty学习——高级篇1 拆包 、粘包与编解码技术

当Server在读取客户端数据的时候,如果一次读取不完整,就会触发channelRead事件,那么Netty是如何处理这类问题的?本节会详细讲解。

2024-04-09 10:00:00 978

原创 Netty学习——源码篇13 命中缓存的分配 备份

以 tinySubPageDirectCaches[1]为例(下标选择1是因为下标为0代表的规格是0Byte,其实就代表一个空的缓存),在tinySubPageDirectCaches[1]的缓存对象中所缓存的ByteBuf的缓冲区大小是16Byte,在tinySubPageDirectCaches[2]中缓存的ByteBuf的大小为32Byte,以此类推,tinySubPageDirectCaches[31]中缓存的ByteBuf大小事496Byte。具体类型规则的配置如下。现在分析命中缓存的相关逻辑。

2024-04-08 15:00:00 679

原创 Netty学习——源码篇13 命中缓存的分配

以 tinySubPageDirectCaches[1]为例(下标选择1是因为下标为0代表的规格是0Byte,其实就代表一个空的缓存),在tinySubPageDirectCaches[1]的缓存对象中所缓存的ByteBuf的缓冲区大小是16Byte,在tinySubPageDirectCaches[2]中缓存的ByteBuf的大小为32Byte,以此类推,tinySubPageDirectCaches[31]中缓存的ByteBuf大小事496Byte。具体类型规则的配置如下。现在分析命中缓存的相关逻辑。

2024-04-08 10:00:00 1292

原创 Netty学习——源码篇12 Netty池化内存管理机制 备份

现在来分析池化内存的分配原理。首先找到AbstractByteBufAllocator的子类PooledByteBufAllocator实现分配内存的两个方法:newDirectBuffer和newHeapBuffer方法。观察发现,这两个方法大体结构是一样的,以newDirectBuffer为例,简单分析一下。首先,通过threadCache.get()方法获得一个类型为PoolThreadCache的cache对象,然后,通过cache获得directArena对象;

2024-04-07 14:00:00 787

原创 Netty学习——源码篇12 Netty池化内存管理机制

首先调用leastUsedArena()方法分别获得类型为PoolArena的heapArena和directArena对象。那么heapArena和directArena对象是在哪里初始化呢?其实就是创建了一个固定大小的PoolArena数组,数组大小由传入的参数nHeapArena和nDirectArena决定。发现nHeapArena和nDirectArena是通过DEFAULT_NUM_HEAP_ARENA, DEFAULT_NUM_DIRECT_ARENA 这两个常量默认赋值的。

2024-04-07 10:30:00 1671

原创 Netty学习——源码篇11 Netty非池化内存分配 备份

现在来看UnpooledByteBufAllocator的内存分配原理。通过调用PlatformDependent.hasUnsafe()方法来判断操作系统是否支持Unsafe,如果支持Unsafe则创建UnpooledUnsafeHeapByteBuf类,否则创建UnpooledHeapByteBuf类。

2024-04-03 14:00:00 906

原创 Netty学习——源码篇11 Netty非池化内存分配

现在来看UnpooledByteBufAllocator的内存分配原理。通过调用PlatformDependent.hasUnsafe()方法来判断操作系统是否支持Unsafe,如果支持Unsafe则创建UnpooledUnsafeHeapByteBuf类,否则创建UnpooledHeapByteBuf类。

2024-04-03 10:00:00 1093

原创 Netty学习——源码篇10 Netty内存分配ByteBuf基础 备份

ByteBuf是Netty整个结构中最为底层的模块,主要负责把数据从底层I/O读取到ByteBuf,然后传递给应用程序,应用程序处理完成后再把数据封装成ByteBuf写回I/O。所以,ByteBuf是直接与底层打交道的一层抽象。

2024-04-02 14:00:00 997

原创 Netty学习——源码篇10 Netty内存分配ByteBuf基础

ByteBuf是Netty整个结构中最为底层的模块,主要负责把数据从底层I/O读取到ByteBuf,然后传递给应用程序,应用程序处理完成后再把数据封装成ByteBuf写回I/O。所以,ByteBuf是直接与底层打交道的一层抽象。

2024-04-02 10:00:00 1357

原创 Netty学习——源码篇9 Netty的Handler其他处理 备份

每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext,并与ChannelHandler关联绑定。ChannelHandlerContext允许ChannelHandler与其他的ChannelHandler进行交互。ChannelHandlerContext不会改变添加到其中的ChannelHandler,因此它是安全的。

2024-04-01 14:00:00 685

原创 Netty学习——源码篇9 Handler其他处理与异步处理

每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext,并与ChannelHandler关联绑定。ChannelHandlerContext允许ChannelHandler与其他的ChannelHandler进行交互。ChannelHandlerContext不会改变添加到其中的ChannelHandler,因此它是安全的。

2024-04-01 10:00:00 979

原创 Oracle基础-PL/SQL编程 备份

数据类型本质上是一种用于描述数据存储的内存结构,用它来决定变量中所存储数据的类型,而变量本质上是一种用名称进行识别的标示符号,它可以存储不同类型的数据。根据不同的数据类型,定义不同名称的变量,这样就可以存储不同类型的数据。变量在程序运行的过程中,其值可以发生变化,与变量对应的就是常量,常量是指在程序运行的过程中,值不会发生变化。变量是指其值在程序运行过程中可以改变的数据存储结构,定义变量必须的元素就是变量名和数据类型,另外还有可选择的初始值,格式如下:[(长度) := ]

2024-03-30 09:01:48 906

原创 Netty学习——源码篇8 Outbound/Inbound传播方式 备份

1、Outbound 事件是请求事件(由Context发起一个请求,并最终由Unsafe处理这个请求)。2、Outbound事件 发起者是Channel。3、Outbound事件的处理者是Unsafe。4、Outbound事件在Pipeline中的传输方向是从Tail到Head。5、在ChannelHandler中处理事件时,如果这个Handler不是最后一个Handler,则需要调用ctx的方法将此事件继续传播下去。如果不这样做,那么此事件的传播会提前终止。

2024-03-28 14:30:00 664

原创 Netty学习——源码篇8 Outbound/Inbound传播方式

可以看到,ChannelOutboundHandlerAdapter的connect方法仅调用了ctx.connect方法,而这个调用又回到了Cotext.connect方法调用Connect.findContextOutbound方法,然后调用next.invokeConect方法,其次调用handler.connect方法,最后又调用Context.connect方法,如此循环下去,直到Connect事件传递到DefaultChannelPipeline的双向链表的头节点,即Head中。

2024-03-28 10:00:00 747

原创 Netty学习——源码篇7 Pipeline的事件传播机制1 备份

并且Inbound方法是通过调用相应的ChannelHandlerContext.fireIN_EVT()方法来传递的,而Outbound方法是通过ChannelHandlerContext的fireChannelRegister()调用会发送一个ChannelRegistered的Inbound给下一个ChannelHandlerContext,而ChannelHandlerContext的bind()方法调用时会发送一个bind的Outbound事件给下一个ChannelHandlerContext。

2024-03-27 15:00:00 613

原创 Netty学习——源码篇7 Pipeline的事件传播机制1

并且Inbound方法是通过调用相应的ChannelHandlerContext.fireIN_EVT()方法来传递的,而Outbound方法是通过ChannelHandlerContext的fireChannelRegister()调用会发送一个ChannelRegistered的Inbound给下一个ChannelHandlerContext,而ChannelHandlerContext的bind()方法调用时会发送一个bind的Outbound事件给下一个ChannelHandlerContext。

2024-03-27 10:30:00 1130

原创 Netty学习——源码篇6 Pipeline设计原理 备份

上面分析了ChannelInitializer是如何插入Pipeline中的,接下来探讨ChannelInitializer在哪里被调用、ChannelInitializer的作用以及自定义的ChannelHandler是如何插入Pipeline中的。@Override再看AbstractChannelHandlerContext的invokeChannelRegister()方法。

2024-03-26 15:00:00 926

原创 Netty学习——源码篇6 Pipeline设计原理

在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应,它们的组成关系如下图:通过上图可以看到,一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的双向链表。这个链表的头是HeadContext,链表的尾是TailContext,并且每个ChannelHandlerContext又关联着一个ChannelHandler。

2024-03-26 10:30:00 1351

原创 Netty学习——源码篇5 EventLoop 备份

中对Reactor的三种线程模型——单线程模型、多线程模型、主从多线程模型做了介绍,这里具体分析Reactor在Netty中的应用。

2024-03-25 14:30:00 807

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除