在Java中忽略您自己的UDP广播

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

我确实尝试使用: if (NetworkInterface.getByInetAddress(packet.getAddress()) != null)但是在某些情况下这会生成IOExceptions(java.net.SocketException:没有网络接口绑定到这样的IP地址)

任何想法?

另外:我的socket上的getInetAddress()抛出NullPointerException

我认为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"); } 

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

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

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

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

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

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

  • 组创建和删除。 组成员可以分布在LAN或WAN上
  • 加入和离开团体
  • 关于加入/离开/崩溃成员的成员资格检测和通知
  • 检测和删除崩溃的成员
  • 发送和接收成员到组消息(点对多点)
  • 发送和接收成员到成员的消息(点对点)