java - Camel Netty UDP监听器监听0.0.0.0并且不接收数据包

标签 java udp netty apache-camel

我对 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 服务器正在监听,它会正常接收数据包(全部通过本地主机完成)。

我还测试了 Camel/Netty/TCP 监听器,效果很好。

为什么监听器监听所有本地地址?如果是这样,为什么它没有从本地主机接收我的数据包?

最佳答案

我明白了。这是我最后的 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 .

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

在 Netty/UDP、Camel/TCP 和“损坏的”Camel/UDP 中进行数小时的逐步调试后,我注意到 Camel Netty 实现使用了来自org.jboss 包来绑定(bind)连接。在我的 Netty 实现中,我使用了 io.netty 包中的 Bootstrap。

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

我还注意到我一次只能发送一次。将属性 disconnectOnNoReply 设置为 false 允许监听器在不断开连接的情况下多次接收。

希望这对将来的人有所帮助。 :)

[编辑]实际上经过进一步测试,“disconnectOnNoReply”可能不需要。我只是在没有它的情况下尝试了它并且它有效。

关于java - Camel Netty UDP监听器监听0.0.0.0并且不接收数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124571/

相关文章:

ssl - SSL认证用户如何通过UDP报文证明真实性?

c - 使用 epoll 的多个 UDP 套接字 - 无法接收数据

java - ConcurrentHashMap 上的 Netty ChannelGroup

java - 在 Spring Data JPA 中嵌入对象而不是链接

java - Lotus Notes Java 代理的 GSON 库错误 - java.lang.NoClassDefFoundError : com. google.gson.JsonObject

java - 关闭 Netty UDP 服务器

memory-leaks - 使用带有 Windows 换行符 (CR LF) 的行时,Camel netty TCP 客户端中的内存泄漏

java - 如何为每条通过netty消息解码器的消息分配一个序列号?

java - Firebase Android "using Firebase.setAndroidContext() before using Firebase."错误

java - 带复选框的 JTree