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());