2017-02-13 90 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

相關問題