我是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 回答
我想到了 . 这是我最后的 Spring 季背景:
在对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.html的
ConnectionlessBootstrap
和org.jboss
包的示例 . 当我开始工作时,我将实现与我的相比较,并注意到他的两端都有编码器和解码器 . 这就是我想到将一个CharsetUtil.ISO_8859_1
解码器添加到我的监听器并设法使项目正常工作的地方 .我也注意到我一次只能发送一次 . 将属性
disconnectOnNoReply
设置为false允许侦听器多次接收而不断开连接 .希望这有助于将来的人 . :)
[编辑]实际上在进一步测试后,可能不需要“disconnectOnNoReply” . 我只是尝试了它没有它,它的工作原理 .