连接到有效的IP端口时抛出UnknownHostException

时间:2017-02-13 19:12:05

标签: java sockets networking inet-socket

当我尝试连接到套接字(有效的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

1 个答案:

答案 0 :(得分:1)

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

开头
; generated by /sbin/dhclient-script

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

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

我的建议是:

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

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

  

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

     

<强> networkaddress.cache.ttl   表示成功的缓存策略   名称服务中的名称查找。该值指定为   整数表示缓存成功的秒数   抬头。默认设置是为特定实现缓存   一段的时间。值-1表示&#34;永远缓存&#34;。

     

networkaddress.cache.negative.ttl (默认值:10)   表示缓存   来自名称服务的未成功名称查找的策略。价值   指定为整数以指示要缓存的秒数   未成功查找失败。值为0表示从不   高速缓存&#34 ;.值-1表示&#34;永远缓存&#34;。

希望这有帮助。