首页 文章

在Camel / Netty中发送UDP并在NIO中接收额外的字节

提问于
浏览
1

我有两个应用程序,一个使用带有Netty组件的Camel发送UDP消息,另一个使用DatagramChannel在Java NIO中接收UDP消息 .

在接收数据时,我在消息前面添加了额外的29个字节 . Netty Camel打印出传出的字节,它看起来很好,但是当我在另一端消息进入时我会执行packet.getData(),它在前面有额外的东西(并且它总是相同的字节) .

Camel或Netty在发送之前是否包装了数据包?

[编辑]其他信息:

-Camel正在打印日志语句,而不是Netty

  • 当消息内容发生变化时,消息前面的字节会发生变化(只有两个字节被更改)

1 回答

  • 0

    我知道这个问题现在已经很老了,但我确实遇到了这个问题,我花了一些时间才找到解决方案 . 所以这里......

    基本上问题归结为当你告诉它发送一个像UDP数据包中的byte []那样足够低级的东西时,camel-netty会做什么的混淆 . 我希望像我这样的OP假设他们正在设置原始数据,但是camel-netty默认使用Java对象序列化 - 导致在预期数据之前出现那些额外的“随机”字节 .

    解决方案是更改有问题的 endpoints 使用的编码器/解码器 . 有各种内置替代品,但如果你需要更多东西,你可以将它们子类化......很奇怪 . 无论哪种方式,该过程是:

    1)根据需要将“encoder =#myEncoder”和“decoder = #myDecoder”选项添加到 endpoints URI . 例如

    String destinationUri = "netty:udp://localhost:4242"
            + "?sync=false&encoder=#myEncoder";
    

    2)将“myEncoder”的映射添加到新的Encoder类的实例到Camel Registry . myDecoder也一样 . 然后在构造CamelContext时使用该注册表 . 例如

    SimpleRegistry registry = new SimpleRegistry();
    registry.put("myEncoder", new StringEncoder());
    registry.put("myDecoder", new StringDecoder());
    CamelContext camelContext = new CamelContext(registry);
    

    显然,真正的诀窍是寻找或制作适合您需求的编码器/解码器 . znetdevelopment上的一篇博文真的对我有所帮助,虽然它更进一步,将自定义编码器放入自定义管道(我忽略了这一点) .

相关问题