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

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

我所要做的就是使用Camel和Netty实现UDP侦听器(目前在Windows 7上,但将项目移至Linux) . 我的 Spring 季配置如下:

<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)

3 years ago

我想到了 . 这是我最后的 Spring 季背景:

<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和"broken" Camel / UDP中进行了数小时的逐步调试之后,我注意到Camel Netty实现使用 org.jboss 包中的 ConnectionlessBootstrap 来绑定连接 . 在我的Netty实现中,我使用了 io.netty 包中的 Bootstrap .

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

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

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

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