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

mdn*_*lue 2 java udp apache-camel netty

我是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>
Run Code Online (Sandbox Code Playgroud)

监听器似乎正常启动(通过Eclipse运行).但是,当我做netstat时,我看到了这个:

UDP    0.0.0.0:5150
UDP    [::ffff:127.0.0.1]:5150
Run Code Online (Sandbox Code Playgroud)

当我期待它在127.0.0.1上收听时.如果这是Camel/Netty/UDP的预期行为,我在网上看到的内容都不清楚.

我正在通过从Java NIO UDP客户端发送来测试它.如果NIO UDP服务器正在侦听,它会正常收到数据包(所有这些都是通过localhost完成的).

我还测试了Camel/Netty/TCP监听器,并且工作正常.

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

mdn*_*lue 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>
Run Code Online (Sandbox Code Playgroud)

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

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

后一步一步的调试中的Netty/UDP,骆驼/ TCP,和"断"骆驼/ UDP的小时,我注意到,骆驼Netty的实施中使用的ConnectionlessBootstraporg.jboss包裹到连接结合.在我的Netty实现中,我正在使用Bootstrapio.netty包.

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

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

希望这有助于将来的人.:)

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