Camel Netty UDP侦听器侦听0.0.0.0并且不接收数据包

时间:2013-02-27 23:26:14

标签: java udp netty apache-camel

我是Camel,Netty和UDP的新手,但我一直在研究这个问题,但仍然无法弄清楚发生了什么。

我所要做的就是使用Camel和Netty(目前在Windows 7上实现UDP侦听器,但将项目移动到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监听器,并且工作正常。

为什么侦听器会侦听所有本地地址?如果是这样,为什么不从localhost接收我的数据包?

1 个答案:

答案 0 :(得分: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的含义的更多信息,请see this link

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

在Netty / UDP,Camel / TCP和“损坏的”Camel / UDP中进行了数小时的逐步调试后,我注意到Camel Netty实现使用{{1}中的ConnectionlessBootstrap用于绑定连接的包。在我的Netty实现中,我使用了org.jboss包中的Bootstrap

我使用http://massapi.com/class/org/jboss/netty/bootstrap/ConnectionlessBootstrap.java.html中的io.nettyConnectionlessBootstrap包找到了一个示例。当我开始工作时,我将实现与我的相比较,并注意到他的两端都有编码器和解码器。这就是我想到将org.jboss解码器添加到我的监听器并设法使项目正常工作的地方。

我也注意到我一次只能发送一次。将属性CharsetUtil.ISO_8859_1设置为false允许侦听器多次接收而不断开连接。

希望这可以帮助将来的某个人。 :)

[edit]实际上在进一步测试后,可能不需要“disconnectOnNoReply”。我只是尝试了它没有它,它的工作原理。