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

标签 java networking protocols netty packet

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

谢谢, 汤姆

最佳答案

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

关于java - Netty:处理许多不同的数据包类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24491163/

相关文章:

类不符合 swift 协议(protocol)

java - 使用 Frame Mat OpenCV Java 检测颜色的有效方法

Docker:仅限制与本地主机的传出连接,同时允许所有传入连接

android - (Android、iOS、Windows、Linux)服务器轮询、推送、实现服务器

c# - Unity Networking : Unity crashes when I call the NetworkManager. singleton.StopClient() 函数

arrays - Swift - 将协议(protocol)数组向上转换为 super 协议(protocol)数组会导致错误

java - Vaadin - 使添加的项目可选择(和可编辑)

java - 终极版 : How do I get Jython to use Python modules stored in Lib within its own jar file when running in Hadoop?

java - Dagger Hilt 测试错误 - 错误 : cannot find symbol @ScopeMetadata, @QualifierMetadata

ios - 条件绑定(bind)的初始化程序必须具有 Optional 类型,而不是 'Error.Protocol'