Netty的使用其实需要开发人员定义各种Handler,合理的运用ChannelPipeline中各种入站、出站的Handler处理业务逻辑,在不同的Handler流转中就涉及粘包半包、序列化反序列化、编解码问题。Netty是一个很强大的网络交互框架,具体的使用还得参考其源码学习相关知识,我这里只是简单的记录下面试过程中面试官问到的一些相关问题(简历上写用过Netty)
1.解决粘包半包问题:
a.在包尾增加分隔符;netty自带的回车换行分隔符,或者自定义分隔符
b.消息定长;例如每个报文长度大小200,长的只截取200,不够的填充空格
c.消息头+消息体的报文形式进行传输;使用LengthFiledBasedFrameDecoder
2.序列化和反序列化
序列化的目的:
1.网络传输
2.对象持久化
JDK有自带的序列化-java.io.Serializable,首先无法跨语言,其次序列化后的码流太大,最后序列化效率过低,因此分布式架构系统下不会采用;
Netty中有自带的序列化和反序列化:JBoss Marshalling 和 Portocol Buffers
基于第三方的MessagePack序列化和反序列化
3.编解码器
将字节解码为消息:ByteToMessageDecoder
将一种消息类型解码为另一种:MessageToMessageDecoder
相反,Netty也提供了一套编码器
将消息编码为字节:MessageToByteEncoder
将消息编码为消息:MessageToMessageEncoder<T>,T代表数据源的类型