大多数 DNS 服务器都有一种机制,允许 DHCP 服务器对本地(内部)区域进行动态更新。如果您可以使用此功能,那么您可以只使用 DNS 名称,并让系统人员确保 DNS 记录与 DHCP 租约是最新的。
使用像dyndns这样的 DDNS 服务,可以在更广泛的互联网上实现类似的基于 DNS 的方法。
如果您不能使用 DNS,那么您就只能使用基于 UDP 广播的方法。这与 DHCP、bonjour 和 SMB 等协议用于在不知道其地址的情况下查找本地网络上的其他计算机的机制相同;而且这种方法只能在这些技术工作的相同环境中工作(通常只在本地网络内,绝对不能跨越更大的互联网)。
在 java 中,您将通过DatagramSocket类完成 UDP 广播消息传递。
引用 api 文档:
UDP 广播发送始终在 DatagramSocket 上启用。为了接收广播数据包,应将 DatagramSocket 绑定到通配符地址。在一些实现中,当 DatagramSocket 绑定到更具体的地址时,也可以接收广播包。
例子:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
这相当于:
DatagramSocket s = new DatagramSocket(8888);
这两种情况都将创建一个 DatagramSocket 能够在 UDP 端口 8888 上接收广播。\
如果您的两台机器位于 Internet 上的不同位置,并且您不能使用 DDNS 服务(如上文提到的 dyndns),那么您最好的选择是构建一个中央注册服务器。这将是一个简单的服务器(甚至可以是一个 Web 服务),它在 Internet 上的一个已知地址上运行。您的每台客户端机器都将向中央注册服务器注册,因此中央注册服务器将知道两台机器的 IP 地址。然后每台机器都可以通过中央注册服务器请求对方的地址。您必须考虑安全性以防止恶意“中毒”您的注册表,否则,这将是相当直接的。
编辑:
我刚刚发现了JXTA。它是一组用于构建具有点对点网络功能的 Java 应用程序的工具。我没有任何直接的经验,但它看起来可以完成您正在寻找的东西(并且可能会为您节省大量工作,而不必从头开始构建它)。
事实上,看起来子项目p2psockets完全符合您的要求。