我正在用 Java 编写将数据存储在数据库服务器上的客户端。到目前为止,必须在客户端的设置中手动指定服务器的 IP 和端口。我听说,可以通过广播/多播/UDP自动确定数据库服务器的IP(我不熟悉这些概念)。问题:有没有办法检索本地网络中所有可用数据库服务器的 IP 地址?到目前为止,我正在使用 h2 数据库系统。
再见,沃尔夫冈
我正在用 Java 编写将数据存储在数据库服务器上的客户端。到目前为止,必须在客户端的设置中手动指定服务器的 IP 和端口。我听说,可以通过广播/多播/UDP自动确定数据库服务器的IP(我不熟悉这些概念)。问题:有没有办法检索本地网络中所有可用数据库服务器的 IP 地址?到目前为止,我正在使用 h2 数据库系统。
再见,沃尔夫冈
在数据库服务器上使用 UDP 广播 :) 这将允许您在本地网络上的所有机器上获取广播,并且广播本身可以携带服务器的 IP 地址。要获取本地 IP,请使用InetAddress ip = InetAddress.getLocalHost();
来自http://java.sun.com/j2se/1.4.2/docs/api/java/net/DatagramSocket.html:
UDP 广播发送始终在DatagramSocket
. 为了接收广播数据包,aDatagramSocket
应该绑定到通配符地址。DatagramSocket
在一些实施方式中,当a被绑定到更具体的地址时,也可以接收广播包。
示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
相当于:DatagramSocket s = new DatagramSocket(8888);
这两种情况都将创建一个DatagramSocket
能够在 UDP 端口 8888 上接收广播。
编辑:您还可以查找网络上的所有 IP 地址;使用http://www.linglom.com/2007/02/20/how-to-find-subnet-number-ip-addresses-in-the-subnet-in-a-few-seconds/上的算法工作取出子网 IP,对其进行迭代,并测试每个 IP 是否是 H2 服务器(尝试连接)。您可能需要多个线程来加快发现速度。
您可能还想考虑为此目的使用Bonjour /Zeroconf 库,而不是重新发明您自己的动态服务发现解决方案。