2

我是 Camel、Netty 和 UDP 的新手,但我已经研究了一段时间,但仍然无法弄清楚发生了什么。

我要做的就是使用 Camel 和 Netty 实现一个 UDP 侦听器(目前在 Windows 7 上,但将把项目移到 Linux 上)。我的弹簧配置如下:

<camel:camelContext id="test">
    <camel:route>
        <camel:from uri="netty:udp://localhost:5150?sync=false"/>
        <camel:to uri="log:cameltest?level=DEBUG"/>     
        <camel:to uri="file://outbox"/>
    </camel:route>
</camel:camelContext>

侦听器似乎可以正常启动(通过 Eclipse 运行)。但是,当我执行 netstat 时,我看到:

UDP    0.0.0.0:5150
UDP    [::ffff:127.0.0.1]:5150

当我期望它在 127.0.0.1 上收听时。我在网上读到的任何内容都不清楚这是否是 Camel/Netty/UDP 的预期行为。

我正在通过从 Java NIO UDP 客户端发送来对此进行测试。如果 NIO UDP 服务器正在侦听,它会很好地接收数据包(全部通过 localhost 完成)。

我还测试了一个 Camel/Netty/TCP 监听器,效果很好。

为什么监听器监听所有本地地址?如果是这样,为什么它没有从本地主机接收我的数据包?

4

1 回答 1

8

我想到了。这是我最后的春天背景:

<bean class="org.jboss.netty.handler.codec.string.StringDecoder" id="stringDecoder">
    <constructor-arg value="ISO_8859_1" />
</bean>

<camel:camelContext id="test">
    <camel:route>
        <camel:from uri="netty:udp://localhost:5150?decoder=#stringDecoder&amp;disconnectOnNoReply=false&amp;sync=false"/>
        <camel:to uri="log:cameltest?level=DEBUG"/>     
        <camel:to uri="file://outbox"/>
    </camel:route>
</camel:camelContext>

在对 UDP 和 Netty 做了一些研究之后,我发现在 0.0.0.0:[port#] 上监听似乎是 Netty/UDP 的默认行为。有关 0.0.0.0 含义的更多信息,请参阅此链接

一位程序员同事建议(因为我本质上是在框架中使用框架),取出骆驼的东西并尝试让它在 Netty 中工作。我试过这个,我能够让它工作,并且还能够从我的 NIO UDP 客户端发送给它。有一段时间我认为问题出在骆驼身上,因为我看不出 Netty 实现有什么问题。

在 Netty/UDP、Camel/TCP 和“损坏的”Camel/UDP 中进行了数小时的逐步调试后,我注意到 Camel Netty 实现使用包中的 aConnectionlessBootstraporg.jboss绑定连接。在我的 Netty 实现中,我使用Bootstrap的是io.netty包中的。

我从http://massapi.com/class/org/jboss/netty/bootstrap/ConnectionlessBootstrap.java.html找到了一个使用ConnectionlessBootstrapandorg.jboss包的示例。当我让它工作时,我将实现与我的实现进行了比较,并注意到他在两端都有一个编码器和解码器。这就是我想为我的听众添加解码器并设法让项目正常工作的地方。CharsetUtil.ISO_8859_1

我还注意到我一次只能发送一次。将该属性设置disconnectOnNoReply为 false 允许侦听器在不断开连接的情况下多次接收。

希望这对将来的人有所帮助。:)

[编辑] 实际上,经过进一步测试,可能不需要“disconnectOnNoReply”。我只是在没有它的情况下尝试过它并且它有效。

于 2013-03-04T16:32:03.323 回答