【问题标题】:Netty: Processing many different packet typesNetty:处理许多不同的数据包类型
【发布时间】:2014-08-20 21:15:39
【问题描述】:

我正在尝试连接到发送许多不同数据包类型的 tcp/ip 接口。每个数据包的长度和内容都不同。我只是想处理每种数据包类型并生成 POJO,这些 POJO 将由另一个状态处理程序再次处理。 到目前为止,我不确定 Netty 中是否有任何结构支持这种类型的处理数据包/帧。我能想到的一个解决方案是创建一个解码器入站处理程序,它根据第一个字节(即类型字段)操纵管道。 Netty 中的哪种结构或算法可以帮助我实现这么简单的 Switch-Case 问题?

谢谢, 汤姆

【问题讨论】:

    标签: java networking protocols netty packet


    【解决方案1】:

    如果您的连接应该处理与第一个数据包类型相同的数据包类型的流(即第一个数据包确定连接的状态),您可以查看the port unification example

    如果您的连接应该处理任意数据包类型的流,您最好编写一个能够理解所有数据包类型并将它们转换为 POJO 的解码器。除非要处理的数据包类型太多,否则应该不会很困难。解码器解码数据包后,管道中的最后一个处理程序将如下所示:

    public class MyPacketHandler extends SimpleChannelInboundHandler {
        @Override
        public void channelRead0(ChannelHandlerContext ctx, Object msg) {
            if (msg instanceof MsgA) {
                handleA(ctx, (MsgA) msg);
            } else if (msg instanceof MsgB) {
                handleB(ctx, (MsgB) msg);
            } ...
        }
    
        private void handleA(ChannelHandlerContext ctx, MsgA msg) {
            ...
        }
        ...
    }
    

    如果您不喜欢繁琐的 if-else 块,您可以使用 java.util.MapClass.isAssignableFrom()

    【讨论】:

    • 我猜你描述的第二种情况适合我的问题。但这意味着 netty 的管道结构对我自己的协议和消息没有帮助 - 对吧?正如你已经说过的 Packethandler 是管道中的最后一个处理程序......
    【解决方案2】:
    猜你喜欢
    • 2016-08-23
    • 2019-05-04
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多