在Java中忽略自己的UDP广播的网络编程
在我的程序中,我发送UDP广播并对其做出反应。我需要一种方法来忽略我发出的UDP广播,但对不是来自我的机器的广播做出反应
我试过使用:
if (NetworkInterface.getByInetAddress(packet.getAddress()) != null)
但在某些情况下,这会产生IOException(java.net.SocketException:没有网络接口绑定到这样的IP地址)
有人有什么想法吗
此外: socket上的getInetAddress()抛出NullPointerException
# 1 楼答案
当然,解决这个问题的“工业实力”解决方案是为每个服务器生成一个随机UUID,并在每个数据包中包含这个ID(可能是int或long)。如果这个ID和你的匹配,你可以放弃它
我不喜欢这个解决方案,因为它会在每个数据包中浪费大量字节。但它简单有效
# 2 楼答案
这并不是你问题的答案。但对于处理UDP广播,您应该看看JGroups:
# 3 楼答案
我认为javadoc和
NetworkInterface getByInetAddress()
的实际实现之间存在一些差异。javadoc似乎暗示,如果没有找到匹配项,getByInetAddress将返回null,但实现要么返回匹配项,要么抛出SocketExceptionJavaDoc
返回:NetworkInterface,如果没有指定IP地址的网络接口,则返回null
实施
我建议要么捕获异常并将其视为来自第三方的答案,要么使用
getNetworkInterfaces()
方法重新实现它# 4 楼答案
你不能为你自己的主机做一个
equals()
介于packet.getAddress()
之间的Address
对象吗