当我尝试连接到套接字(有效的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
答案 0 :(得分:1)
通常您的resolv.conf文件由DHCP客户端填充。如果您看到此文件的内容,则可能以
开头; generated by /sbin/dhclient-script
建议不要手动编辑此文件。此文件指向DNS(或多个DNS服务器),如果您要使用DNS解析,则DNS中必须存在正确的映射。
在您的示例中,您不会提及 ipAddress 的变量类型。您描述的行为表明您 ipAddress 变量是一个字符串。这将导致InetSocketAddress构造函数尝试主机名解析,这可能会导致您遇到的行为。
我的建议是:
来自Java API。这些是驱动主机名解析缓存行为的属性:
两个Java安全属性控制用于肯定的TTL值 和负主机名解析缓存:
<强> networkaddress.cache.ttl 强> 表示成功的缓存策略 名称服务中的名称查找。该值指定为 整数表示缓存成功的秒数 抬头。默认设置是为特定实现缓存 一段的时间。值-1表示&#34;永远缓存&#34;。
networkaddress.cache.negative.ttl (默认值:10) 表示缓存 来自名称服务的未成功名称查找的策略。价值 指定为整数以指示要缓存的秒数 未成功查找失败。值为0表示从不 高速缓存&#34 ;.值-1表示&#34;永远缓存&#34;。
希望这有帮助。