繁体   English   中英

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

[英]UnknownHostException is thrown while connecting to a valid ip port

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

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

; generated by /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表示“永远缓存”。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM