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