netty 的一些笔记

在 Netty 中,有两种发送消息的方式。你可以直接写到 Channel 中,也可以 写到和 ChannelHandler相关联的ChannelHandlerContext对象中。前一种方式将会导致消息从ChannelPipeline 的尾端开始流动,而后者将导致消息从 ChannelPipeline 中的下一个 ChannelHandler 开始流动。

netty有一个pipeline地概念,有入站和出站两种。

下面这些是编写自定义 ChannelHandler 时经常会用到的适配器类:
 ChannelHandlerAdapter
 ChannelInboundHandlerAdapter
 ChannelOutboundHandlerAdapter
 ChannelDuplexHandler

这两种类型的引导类之间的第一个区别已经讨论过了: ServerBootstrap 将绑定到一个
端口,因为服务器必须要监听连接, 而 Bootstrap 则是由想要连接到远程节点的客户端应用程
序所使用的。
第二个区别可能更加明显。引导一个客户端只需要一个 EventLoopGroup,但是一个
ServerBootstrap 则需要两个(也可以是同一个实例)。为什么呢?


因为服务器需要两组不同的 Channel。第一组将只包含一个 ServerChannel,代表服务
器自身的已绑定到某个本地端口的正在监听的套接字。 而第二组将包含所有已创建的用来处理传
入客户端连接(对于每个服务器已经接受的连接都有一个) 的 Channel。图 3-4 说明了这个模
型,并且展示了为何需要两个不同的 EventLoopGroup。

在netty里面有几个概念
Channel,ChannelPipeline,ChannelConfig

netty内部有几种传输组件
NIO,OIO,epoll,embeded,local

//netty修改程序是同步还是异步只需要将group和channel从Nio和Oio之间修改就可以了

一般来说对于char使用Stream来做处理的
byte是用ByteBuffer来做处理的,但是ByteBuffer太过于复杂了,在netty里面新加入了ByteBuf这个类型

ByteBuf 一般是直接把空间分配在java的堆上


虽然 ByteBuf 同时具有读索引和写索引,但是 JDK 的 ByteBuffer 却只有一个索引,这
也就是为什么必须调用 flip()方法来在读模式和写模式之间进行切换的原因。
0----readIndex----writerIndex----capacity

heapBuffer()
directBuffer()
compositeBuffer()

ByteBufAllocator allocator2 = ctx.alloc();
默认来讲,netty实现了一个池化的jemalloc用来分配内存空间

Unpooled.copiedBuffer()

ChannelUnregistered Channel 已经被创建,但还未注册到 EventLoop
ChannelRegistered Channel 已经被注册到了 EventLoop
ChannelActive Channel 处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了
ChannelInactive Channel 没有连接到远程节点

基本来说,每次有客户端请求的时候,就会重新去建立一个channel。
public void channelRead(ChannelHandlerContext ctx, Object msg) {
    ReferenceCountUtil.release(msg);
}
一般来说当读取了数据后需要把他置0

当使用SimpleChannelInboundHandler就没有问题了


###   当一个消息没有往下传的时候就需要被显式地释放掉,如果式outbound就需要promise.setSuccess()
总之,如果一个消息被消费或者丢弃了, 并且没有传递给 ChannelPipeline 中的下一个
ChannelOutboundHandler
, 那么用户就有责任调用 ReferenceCountUtil.release()。
如果消息到达了实际的传输层, 那么当它被写入时或者 Channel 关闭时,都将被自动释放。

 

 

当处理ChannelRead的时候,如果没有使用FireChannelRead则必须手工释放掉msg,否则就会溢出
SimpleChannelHandler 实际上会自动释放一个消息
如果消息被消耗,并不会传入下一个OutboundHandler,当调用release的时候,会被释放
如果直接在channel或者pipeline上面调用write,会在整个串上都带上这个改变,但是如果在context上面写,只会在这个人的后面上有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值