【发布时间】:2011-06-06 15:15:03
【问题描述】:
如果我使用new Socket("unit.domain.com", 100) 进行连接,并且unit.domain.com DNS 记录在 A 记录中有多个 IP 地址。如果连接失败,Java 是否会自动连接到列表中的其他地址之一像浏览器一样?还是必须手动实现?
【问题讨论】:
标签: java tcp connection dns failover
如果我使用new Socket("unit.domain.com", 100) 进行连接,并且unit.domain.com DNS 记录在 A 记录中有多个 IP 地址。如果连接失败,Java 是否会自动连接到列表中的其他地址之一像浏览器一样?还是必须手动实现?
【问题讨论】:
标签: java tcp connection dns failover
不! 通过 new Socket(String, int) 创建一个套接字会导致这样的解析
addr = InetAddress.getByName(hostname);
这是
的快捷方式return InetAddress.getAllByName(host)[0];
地址解析在Socket c-tor中进行。
如果您必须重新连接(故障转移),请使用 InetAddress.getAllByName(host) 返回的结果,随机化(或使用循环)并连接到必要的地址。
编辑:另外,如果您需要连接一些可能的故障,最好使用带有超时的 Socket 类的连接方法。 另外确保关闭失败的套接字(尤其是通道),因为它们可能会在 *Nix 上泄漏 FD。
【讨论】: