【问题标题】:Java UDP problemJava UDP问题
【发布时间】:2011-09-16 14:37:22
【问题描述】:

我正在运行一个 UDP 客户端,它侦听多播 ip 230.10.10.10 ,端口 11111 以获取消息。如果我在与 UDP 广播器相同的服务器中运行客户端 java 代码,我能够接收 UDP 消息。但是,如果我在同一域中的另一台服务器上运行它,我不会收到任何消息。

我使用的是 windows server 2008。请告诉我如何调试它?

【问题讨论】:

    标签: java networking udp multicast udpclient


    【解决方案1】:

    首先,UDP 不是有保证的传输协议。 其次,UDP 数据包可能会在您的网络上被防火墙或过滤。

    您可以从客户端计算机连接到端口 11111 上的服务器计算机吗?

    【讨论】:

    • 我同意这一点。您的一个路由器可能会过滤 UDP 包。甚至可以是你的“服务器”的本地防火墙。
    • 因为是服务器,所以无法关闭防火墙。但是,我在防火墙设置中为端口 11111 添加了例外。我想知道的是,如何确定是防火墙问题还是路由器过滤器问题?是否有任何工具或任何帮助类来调试这个?
    【解决方案2】:

    感谢大家的帮助。我现在已经解决了。解决方法是在Listener中调用setInterface()方法

    DatagramSocket datagramSocket = new MulticastSocket(multicastPort);
    ((MulticastSocket) datagramSocket).setInterface(inetNicAddress);
    

    广播器是多宿主的,有两个 IP 地址,监听器只有一个 IP。所以,当我在 setInterface 方法中设置监听器 IP 时,它工作正常。

    但我仍然不确定这是如何工作的,因为 setInterface 方法在广播器中被调用,因为它是多宿主的,没关系。但是为什么还要在监听器中设置它呢? .任何建议都会有所帮助。

    【讨论】:

    • 很高兴听到您终于找到了解决方案。我建议您对此提出一个新问题,而不是在您自己的答案中提出一个问题。否则几乎没有人会找到它。
    【解决方案3】:

    问题也可能是多播数据包的 TTL。如果为 0,则只能在本地接收包裹。我建议您使用Wireshark 之类的工具检查网络流量。如果这是问题所在,请将 TTL 值增加到 32。您可能还需要设置 -Djava.net.preferIPv4Stack=true

    【讨论】:

    • 我是否在发送者和接收者中都设置了这个 ipv4 属性? ttl 设置为 1
    • 请务必将其设置在两侧。
    • TTL 为 1 意味着包被限制在同一个子网中,不会被路由器转发。
    • @jeha 不,您只需在发件人处设置它。当然,如果双方都是发件人,请将其设置在双方...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2011-02-22
    • 2016-04-30
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多