【问题标题】:Ignoring your own UDP broadcasts in Java在 Java 中忽略您自己的 UDP 广播
【发布时间】:2010-01-06 12:34:28
【问题描述】:

在我的程序中,我发送 UDP 广播并对它们做出反应。我需要一种方法来忽略 发出的 UDP 广播,但对不是来自我的机器的广播做出反应。

我确实尝试过使用: if (NetworkInterface.getByInetAddress(packet.getAddress()) != null) 但这在某些情况下会产生 IOExceptions(java.net.SocketException: no network interface is bound to such an IP address)

有人有什么想法吗?

还有: 我的套接字上的 getInetAddress() 抛出 NullPointerException

【问题讨论】:

    标签: java network-programming udp


    【解决方案1】:

    当然,对此的“工业实力”解决方案是为每个服务器生成一个随机 UUID,并在每个数据包中包含此 ID(它可以是 int 或 long)。如果该 ID 与您自己的匹配,则可以删除它。

    我不喜欢这个解决方案,因为它在每个数据报包中浪费了很多字节。但它简单而有效。

    【讨论】:

      【解决方案2】:

      我认为 javadoc 与 NetworkInterface getByInetAddress() 的实际实现之间存在一些差异。 javadoc 似乎建议 getByInetAddress 如果未找到匹配项将返回 null,但实现要么返回匹配项,要么抛出 SocketException。

      JavaDoc

      public static NetworkInterface getByInetAddress(InetAddress addr)
                                                     throws SocketException
      

      返回:一个 NetworkInterface 或 如果没有具有指定 IP 地址的网络接口,则返回 null

      实施

        public static NetworkInterface getByInetAddress (InetAddress addr)
          throws SocketException
        {
          if (networkInterfaces == null)
            networkInterfaces = getRealNetworkInterfaces ();
      
          for (Enumeration interfaces = networkInterfaces.elements ();
               interfaces.hasMoreElements (); )
            {
              NetworkInterface tmp = (NetworkInterface) interfaces.nextElement ();
      
              for (Enumeration addresses = tmp.inetAddresses.elements ();
                   addresses.hasMoreElements (); )
                {
                  if (addr.equals ((InetAddress) addresses.nextElement ()))
                    return tmp;
                }
            }
      
          throw new SocketException (
            "no network interface is bound to such an IP address");
        }
      

      我建议要么捕获异常并将其视为来自第 3 方的答案,要么使用 getNetworkInterfaces() 方法重新实现它。

      【讨论】:

      • 啊,这更有意义,谢谢。我只有在广播不是来自我的机器时才真正感兴趣,所以我不确定捕捉它是我的最佳选择。将 getByInetAddress 重新实现为我的类中的方法并且不引发异常会很愚蠢吗?
      • 我完全赞成提高可读性,所以重新实现可能是更好的选择。
      【解决方案3】:

      你不能在packet.getAddress()Address 对象之间为你自己的主机做一个equals() 吗?

      【讨论】:

      • DatagramSocket 绑定到 0.0.0.0 但数据包来自 LAN IP(在本例中为 192.168.1.103) - 这就是为什么我试图查看数据包的源地址是否在 @ 987654325@
      • 无赖!我也很难为自己的主人找到一个有意义的地址。在初始化时给自己发送一条测试消息怎么样?听起来很笨拙,但我几乎没有想法。
      【解决方案4】:

      这不完全是您问题的答案。但是对于处理 UDP 广播,你应该看看JGroups

      JGroups 是一个可靠的多播通信工具包。 (请注意,这并不一定意味着 IP 多播,JGroups 也可以使用 TCP 等传输)。它可用于创建进程组,其成员可以相互发送消息。主要特点包括

      • 组创建和删除。组成员可以分布在 局域网或广域网
      • 加入和离开组
      • 关于加入/离开/崩溃的成员检测和通知 成员
      • 检测和移除崩溃的成员
      • 发送和接收成员到组的消息 (点对多点)
      • 发送和接收成员到成员的消息 (点对点)

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2011-11-16
        • 2012-03-28
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        相关资源
        最近更新 更多