【问题标题】:MessageToMessageCodec vs MessageToMessageDecoder and MessageToMessageEncoder in nettyNetty 中的 MessageToMessageCodec 与 MessageToMessageDecoder 和 MessageToMessageEncoder
【发布时间】:2020-11-15 01:06:41
【问题描述】:

我正在创建一个基于数据包的服务器应用程序,我想知道使用 MessageToMessageCodec 对数据包进行编码和解码更好还是单独的编码器和解码器用于哪个更好?

对于MessageToMessageCodec,我需要考虑一些具体的事情吗?为什么不能将MessageToMessageCodec 注释为@Sharable

每个通道的管道是这样的:

  • LengthFieldPrepender
  • LengthFieldBasedFrameDecoder
  • CryptoHandler(扩展 MessageToMessageCodec 用于解密和 加密数据包)
  • PacketDecoder(扩展 MessageToMessageDecoder)
  • PacketEncoder(扩展 MessageToMessageEncoder)
  • NetworkHandler(扩展 SimpleChannelInboundHandler)

我应该使用MessageToMessageCodec 进行编码和解码吗?有什么优点和缺点,哪个更有效?

【问题讨论】:

    标签: java networking netty codec


    【解决方案1】:

    在源代码中,编解码器只是结合了编码器和解码器。它在幕后使用每个实例: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 最终实现了ChannelInboundHandlerChannelOutboundHandler,所以是的,您可以将它用于编码和解码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2015-11-02
      • 2017-11-26
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多