MessageToMessageCodec 与 netty 中的 MessageToMessageDecoder 和 MessageToMessageEncoder
MessageToMessageCodec vs MessageToMessageDecoder and MessageToMessageEncoder in netty
我正在创建一个基于数据包的服务器应用程序,我想知道是使用 MessageToMessageCodec 对数据包进行编码和解码还是使用单独的编码器和解码器更好?
我需要为 MessageToMessageCodec
考虑一些具体的事情吗?为什么不能将 MessageToMessageCodec
注释为 @Sharable
?
每个通道的管道是这样的:
- LengthFieldPrepender
- LengthFieldBasedFrameDecoder
- CryptoHandler(扩展 MessageToMessageCodec 用于解密和
加密数据包)
- PacketDecoder(扩展 MessageToMessageDecoder)
- PacketEncoder(扩展 MessageToMessageEncoder)
- NetworkHandler(扩展 SimpleChannelInboundHandler)
我应该使用 MessageToMessageCodec
进行编码和解码吗?有什么优缺点,哪个更有效?
在源代码中,编解码器只是结合了编码器和解码器。它在幕后使用了每个实例:https://github.com/netty/netty/blob/00afb19d7a37de21b35ce4f6cb3fa7f74809f2ab/codec/src/main/java/io/netty/handler/codec/ByteToMessageCodec.java#L37-L39
使用编解码器或使用编码器和解码器似乎没有区别。提供所有 3 类 确实允许一个或另一个的灵活性,如果解决方案需要的话,如果不需要的话,编解码器的便利性。
举个例子,ByteToMessageCodec
不能注解为@Sharable,因为ByteToMessageDecoder
不能注解为@Sharable,前者是由后者等组成的。
ByteToMessageCodec
最终同时实现了 ChannelInboundHandler
和 ChannelOutboundHandler
所以是的,您可以将它用于编码和解码。
我正在创建一个基于数据包的服务器应用程序,我想知道是使用 MessageToMessageCodec 对数据包进行编码和解码还是使用单独的编码器和解码器更好?
我需要为 MessageToMessageCodec
考虑一些具体的事情吗?为什么不能将 MessageToMessageCodec
注释为 @Sharable
?
每个通道的管道是这样的:
- LengthFieldPrepender
- LengthFieldBasedFrameDecoder
- CryptoHandler(扩展 MessageToMessageCodec 用于解密和 加密数据包)
- PacketDecoder(扩展 MessageToMessageDecoder)
- PacketEncoder(扩展 MessageToMessageEncoder)
- NetworkHandler(扩展 SimpleChannelInboundHandler)
我应该使用 MessageToMessageCodec
进行编码和解码吗?有什么优缺点,哪个更有效?
在源代码中,编解码器只是结合了编码器和解码器。它在幕后使用了每个实例:https://github.com/netty/netty/blob/00afb19d7a37de21b35ce4f6cb3fa7f74809f2ab/codec/src/main/java/io/netty/handler/codec/ByteToMessageCodec.java#L37-L39
使用编解码器或使用编码器和解码器似乎没有区别。提供所有 3 类 确实允许一个或另一个的灵活性,如果解决方案需要的话,如果不需要的话,编解码器的便利性。
举个例子,ByteToMessageCodec
不能注解为@Sharable,因为ByteToMessageDecoder
不能注解为@Sharable,前者是由后者等组成的。
ByteToMessageCodec
最终同时实现了 ChannelInboundHandler
和 ChannelOutboundHandler
所以是的,您可以将它用于编码和解码。