Netty:处理许多不同的数据包类型

时间:2014-06-30 13:23:52

标签: java networking protocols netty packet

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

THX, 汤姆

2 个答案:

答案 0 :(得分:4)

如果您的连接应该处理与第一个数据包类型相同的数据包类型的流(即第一个数据包确定连接的状态),您可以查看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()

答案 1 :(得分:1)