Netty的SimpleChannelInboundHandler无法处理String类型数据原因解析

文章解释了SimpleChannelInboundHandler为何不能直接处理String类型的消息,原因是它期望接收到ByteBuf类型的入站消息。解决方案包括添加StringDecoder到ChannelPipeline,或者手动进行消息的编解码。对于初学者,这是一个常见的困惑点,但通过理解Netty的处理流程可以轻松解决。
摘要由CSDN通过智能技术生成

Netty的SimpleChannelInboundHandler无法处理泛型为String类型消息的原因解析

1. 跟踪源码

SimpleChannelInboundHandler 继承自 ChannelInboundHandlerAdapter
重写了父类的 channelRead 方法,接受入站消息时会检查消息类型,必须是 ByteBuf的子类,才可以调用 channelRead0 方法,否则执行下一个 ChannelInboundHandler 的 channelRead 事件。

2. 找到原因

SimpleChannelInboundHandler:channelRead 方法,接受入站消息时会检查消息类型,必须是 ByteBuf的子类,才可以调用 channelRead0 方法,否则执行下一个 ChannelInboundHandler 的 channelRead 事件。

3. 解决方案

3.0 解决方案〇:

ChannelPipeline里添加一个解码器就行了
pipeline.addLast(new StringDecoder());

3.1 解决方案一:

替换泛型类型,ByteBuf,手动对消息编解码:
编码:Unpooled.wrappedBuffer(“hello.”.getBytes())
解码:ByteBufUtil.getBytes(msg)

3.2 解决方案二:

替换处理类,改为:ChannelInboundHandlerAdapter
手动处理消息,同上。
编码:Unpooled.wrappedBuffer(“hello.”.getBytes())
解码:ByteBufUtil.getBytes(msg)

3.2 解决方案三

重写SimpleChannelInboundHandler的channelRead方法,感觉没必要。

4. 总结

刚开始深入学习netty,买了一本书,第一章代码跑不通,自己去网上找解决方案也没有类似的,所以自己去找了一下原因,可能不太准确,但是现在可以跑的通了。

如果有大佬解释一下更深层次的原因和更好的解决方案,请畅所欲言。

显然,年轻了,添加一个解码器就行了。
pipeline.addLast(new StringDecoder());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值