Netty入站出站介绍及借助使用到责任链简单实现实现网络编程中拆包和粘包

本文介绍了Netty如何通过责任链处理入站和出站事件,并详细讲解了网络编程中拆包和粘包的现象及原因。Netty提供了多种拆包器如FixedLengthFrameDecoder等来解决这一问题,通过示例展示了如何使用固定长度拆包器来处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Netty入站出站事件

入站事件:
通常指I/O线程生成入站数据。(通俗理解:从socket底层往上冒的事件都是入站)比如EventLoop收到selector的OP_READ事件,入站处理器调用socketChannel.read(ByteBuffer)接收到数据后,这将通道ChannelPipeline中包含的下一个channelRead方法被调用。

在这里插入图片描述

出站事件:
经常是指I/O线程执行实际的输出操作。(通俗理解:主动往socket底层操作的事件都是出站)比如bind方法的用意是请求server socket绑定的SocketAddress,这将导致通道的ChannelPipline包含下一个出站处理器中bind方法被调用。
在这里插入图片描述

Netty通过责任链实现出入站事件处理

我们在使用责任链的时候更多的是
在这里插入图片描述
netty的责任链,与我们我们经常使用到责任链相比多了ChannelPipeline来维护这个责任链。
ChannelPipeline链中存储的也并不是直接的处理的处理器,而是包裹handler处理器的DefaultChannelHandlerContext。
对于我这边理解之所以引入ChannelPipeline这个上下文,是因为在在使用handler处理器的时候,需要有添加和删除handler的操作,用ChannelPipeline这个这个责任链能够更好管理hanler处理。

DefaultChannelHandlerContext这种包装的代替handler的原因,是在handler处理的时候,可能会经常遇到另外线程池的处理,而更好关注业务本身用DefaultChannelHandlerContext代替了handler.
在这里插入图片描述

在这里插入图片描述

那我之所以需要分入站与出站,这个是因为我们在添加责任链的时候,入站事件只会处理入站事件,而出站同样也只能处理出站事件。
在这里插入图片描述

借助责任链简单解决一下网络编程中拆包和粘包

拆包和粘包出现的原因:
(1)由于Nagle算法可能会将一些,要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;

(2)接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

(3)要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值