2017-02-13 89 views
0

当我尝试连接到套接字(有效的ip:端口)UnknownHostException被随机抛出!连接到有效的ip端口时引发UnknownHostException

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

我们的本地应用环境的/etc/resolve.conf被配置为与本地名称服务器的ip地址,在该结构的UnknownHostException(几乎在50:50比率)是随机发生的。

但是当resolve.conf的条目被清除并留为空时UnknownHostException从未发生,并且套接字连接顺利建立。

如何解决此问题,因为无法将resolve.conf也保留为空白!

操作系统:CentOS的7

+0

是什么让你认为问题出在应用程序上?这听起来像namserver是罪魁祸首。 – Malt

+0

@Malt是的名称服务器可能是罪魁祸首,但使用构造函数'InetSocketAddress(String hostname,int port)'并让ipAddress使不必要的查找给出UnknownHostException。 – technaren

回答

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名称映射,另一种方法是编辑/ etc/hosts文件以包含映射。

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

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

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

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

希望这会有所帮助。

+0

谢谢@Javier。是的,我将ipAddress作为String和resolv.conf文件中的两个不同的名称服务器条目。有时String ipAddress被解析为一个有效的IP,有时它失败了。所以不必要的DNS查找给了UnknownHostException,使用这个构造函数'InetSocketAddress(InetAddress addr,int port)'而不是'InetSocketAddress(String hostname,int port)'应该解决我的问题。感谢您的努力。 – technaren

相关问题