2012-07-25 14 views
7

java.net.InetAddress डिफ़ॉल्ट रूप से स्थानीय मशीन के डिफ़ॉल्ट होस्ट-नाम समाधानकर्ता का उपयोग कर होस्ट नामों को हल करता है:जावा में कस्टम DNS सर्वर का उपयोग करने के लिए होस्टनाम रिज़ॉल्यूशन को कॉन्फ़िगर कैसे करें?

होस्ट नाम करने वाली आईपी पते संकल्प जैसे सेवाओं नामकरण स्थानीय मशीन विन्यास सूचना और नेटवर्क का एक संयोजन के उपयोग के माध्यम से पूरा किया है डोमेन नाम सिस्टम (डीएनएस) और नेटवर्क सूचना सेवा (एनआईएस)। डिफ़ॉल्ट नामकरण सेवाओं का उपयोग डिफ़ॉल्ट रूप से स्थानीय मशीन को एक कॉन्फ़िगर किया गया है। किसी भी मेजबान नाम के लिए, इसका संबंधित आईपी पता वापस कर दिया जाता है। [source]

कैसे हम स्थानीय मशीन के डिफ़ॉल्ट होस्ट नाम समाधानकर्ता को संशोधित किए बिना इस व्यवहार कॉन्फ़िगर कर सकते हैं? 4860: 4860 :: 8888, 2001: 4860: 4860

उदाहरण के लिए, कॉन्फ़िगर करने के लिए इस तरह के java.net.InetAddress यह OpenDNS (208.67.222.222, 208.67.220.220) या Google सार्वजनिक DNS (2001 के माध्यम से मेजबान के नाम का समाधान करता है कि वैसे भी है: : 8844)?

या डीएनएस पैकेट अनुरोधों को स्पष्ट रूप से बनाने का एकमात्र समाधान है, उन्हें java.net.DatagramSocket या java.net.Socket के माध्यम से सर्वर पर भेज दें, और प्रतिक्रियाओं को पार्स करें?

उत्तर

8

जावा 9 ने इस क्षमता को हटा दिया। आपको किसी तृतीय पक्ष DNS क्लाइंट लाइब्रेरी का उपयोग करने की आवश्यकता होगी।

आप जावा 8 या उससे अधिक आप कर सकते हैं का उपयोग कर रहे हैं:

आप सिस्टम संपत्ति sun.net.spi.nameservice.nameservers रूप this site.

+1

जैसा कि एक ही साइट में प्रलेखित किया गया है: "ये गुण भविष्य में रिलीज़ में समर्थित नहीं हो सकते हैं।" क्या इसे हासिल करने का कोई और तरीका है? – bernatp

+2

नहीं। नहीं, अगर आप 'java.net.InetAddress' का उपयोग करना चाहते हैं। यदि आप एक अलग तंत्र का उपयोग कर ठीक हैं तो आप निश्चित रूप से किसी तृतीय पक्ष DNS लाइब्रेरी का उपयोग कर सकते हैं (उदा। [Dnsjava] (http://www.dnsjava.org/))। गुणों को बदलने का एकमात्र वास्तविक कारण यह है कि यदि ओरेकल जावा के कुछ भावी संस्करण में 'java.net' कार्यान्वयन को ओवरहाल करता है। यदि ऐसा होता है तो वे उस समय भी इस समस्या का एक नया समाधान प्रदान करेंगे। – Pace

+0

उन्होंने जावा 9 में 'java.net' को ओवरहाल किया, इसलिए' sun.net' वर्गों को इसे बंद करने के लिए आवश्यक नहीं है। – ndm13

1

यहाँ द्वारा प्रलेखित सेट कर सकते हैं कोड मैं कड़ी मेहनत से कोड एक foo प्रणाली नाम DNS को पत्र लिखा है परीक्षण मामलों के लिए जावा में संकल्प पास करने के लिए। इसका लाभ डिफ़ॉल्ट जावा रनटाइम DNS रिज़ॉल्यूशन में आपकी विशिष्ट प्रविष्टि को जोड़ना है।

मैं को में चलाने के लिए अनुशंसा नहीं करता हूं। जबरन प्रतिबिंबित पहुंच और जावा रनटाइम गैर-सार्वजनिक कार्यान्वयन कक्षाओं का उपयोग किया जाता है!

private static final String FOO_IP = "10.10.8.111"; 

/** Fake "foo" DNS resolution */ 
@SuppressWarnings("restriction") 
public static class MyHostNameService implements sun.net.spi.nameservice.NameService { 
    @Override 
    public InetAddress[] lookupAllHostAddr(String paramString) throws UnknownHostException { 
     if ("foo".equals(paramString) || "foo.domain.tld".equals(paramString)) { 
      final byte[] arrayOfByte = sun.net.util.IPAddressUtil.textToNumericFormatV4(FOO_IP); 
      final InetAddress address = InetAddress.getByAddress(paramString, arrayOfByte); 
      return new InetAddress[] { address }; 
     } else { 
      throw new UnknownHostException(); 
     } 
    } 
    @Override 
    public String getHostByAddr(byte[] paramArrayOfByte) throws UnknownHostException { 
     throw new UnknownHostException(); 
    } 
} 

static { 
    // Force to load fake hostname resolution for tests to pass 
    try { 
     List<sun.net.spi.nameservice.NameService> nameServices = 
      (List<sun.net.spi.nameservice.NameService>) 
      org.apache.commons.lang3.reflect.FieldUtils.readStaticField(InetAddress.class, "nameServices", true); 
     nameServices.add(new MyHostNameService()); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

उम्मीद है कि यह मदद करता है, लेकिन फिर से, देखभाल के साथ उपयोग किया जाता है!

संबंधित मुद्दे