0

当我尝试连接到套接字(有效的 ip:port)时,会随机抛出 UnknownHostException!

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

我们本地应用程序环境的/etc/resolve.conf配置了我们本地名称服务器的 ipAddress,此配置 UnknownHostException 随机发生(几乎以 50:50 的比例)。

但是当 resolve.conf 的条目被清除并留空 UnknownHostException 永远不会发生,并且套接字连接顺利建立。

我怎样才能解决这个问题,因为也无法将 resolve.conf 留空!

操作系统:CentOS 7

4

1 回答 1

1

通常,您的 resolv.conf 文件由您的 DHCP 客户端填充。如果您看到此文件的内容,它可能以

; 由 /sbin/dhclient-script 生成

不建议手动编辑此文件。该文件指向一个 DNS(或多个 DNS 服务器),如果您要使用 DNS 解析,那么正确的映射必须存在于 DNS 中。

在您的示例中,您没有提到ipAddress是什么类型的变量。您描述的行为表明您的ipAddress变量是一个字符串。这将导致 InetSocketAddress 构造函数尝试进行主机名解析,这可能会导致您遇到的行为。

我的建议是:

  • 如果要使用 IP 地址,则应确保 InetSocketAddress 接收到java.net.InetAddress对象。如果您查看此 API 页面,您将看到有 2 个属性可以修改主机名解析缓存的行为。
  • 如果您要在服务器中拥有 ip/主机名映射,另一种方法是编辑您的 /etc/hosts 文件以包含映射。

来自 Java API。这些是驱动主机名解析缓存行为的属性:

两个 Java 安全属性控制用于正和负主机名解析缓存的 TTL 值:

networkaddress.cache.ttl 指示从名称服务中成功查找名称的缓存策略。该值指定为整数,以指示缓存成功查找的秒数。默认设置是缓存实现特定的时间段。-1 值表示“永远缓存”。

networkaddress.cache.negative.ttl(默认值:10)指示从名称服务中不成功的名称查找的缓存策略。该值指定为整数,以指示缓存不成功查找失败的秒数。值 0 表示“从不缓存”。-1 值表示“永远缓存”。

希望这可以帮助。

于 2017-02-13T19:34:45.967 回答