2011-09-19 9 views
6

के पते मैं foo.comएकाधिक आईपी के साथ जावा Httpurlconnection DNS रिज़ॉल्यूशन

foo.com है एकाधिक ए-रिकॉर्ड्स कि अलग आईपी पते (1.1.1.1 और 1.1.1.2) को इंगित

हिट करने के लिए जावा के HttpUrlConnection उपयोग कर रहा हूँ

यदि मेरा पहला कनेक्ट कॉल 1.1.1.1 तक हल हो जाता है, लेकिन फिर वह मशीन नीचे जाती है, तो बाद में कनेक्ट कॉल इस पहचान को पहचान लेगा और इसके बजाय 1.1.1.2 पर कनेक्ट करने का प्रयास करेगा?

या क्या मुझे INetAddress api का उपयोग करके इस तरह के तर्क को लागू करने की आवश्यकता है?

+0

यदि पैरामीटर आईपी के बजाय यूआरएल है, तो आपको इसकी परवाह करने की आवश्यकता नहीं है। – Jacob

उत्तर

6

मैं Apache Commons HttpClient का उपयोग करके इसे हल करने में सक्षम था, नीचे कोड स्निपेट देखें।

जैसा कि मुझे डर था, java.net द्वारा प्रदान किया गया URLConnection एक बहुत ही सरल कार्यान्वयन है और केवल हल की गई सूची से पहला आईपी पता आज़माएगा। यदि आपको वास्तव में किसी अन्य लाइब्रेरी का उपयोग करने की अनुमति नहीं है, तो आपको अपनी खुद की त्रुटि प्रबंधन लिखनी होगी। यह थोड़ी गन्दा है, क्योंकि आपको इनएट एड्रेस का उपयोग करके हाथ से पहले सभी आईपी को हल करने की आवश्यकता होगी, और प्रत्येक आईपी से "होस्ट: डोमेन.नाम" हेडर को HTTP स्टैक पर पास करने के लिए कनेक्ट करें जब तक कि आईपी में से कोई जवाब न दे।

अपाचे लाइब्रेरी बहुत अधिक मजबूत है और अनुकूलन का एक बड़ा सौदा करने की अनुमति देता है। आप नियंत्रित कर सकते हैं कि यह कितनी बार पुनः प्रयास करेगा और, सबसे महत्वपूर्ण बात यह है कि यह स्वचालित रूप से उसी नाम पर हल किए गए सभी आईपी पतों को आजमाएगा जब तक कि उनमें से कोई सफलतापूर्वक प्रतिक्रिया न दे।

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { 
    @Override 
    public boolean retryRequest(IOException exception, int count, HttpContext context) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     return count < 30; 
    } 
}; 

ConnectionKeepAliveStrategy keepAlive = new ConnectionKeepAliveStrategy() { 
    @Override 
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) { 
     return 500; 
    } 
}; 

DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter("http.socket.timeout", new Integer(2000)); 
httpclient.getParams().setParameter("http.connection.timeout", new Integer(2000)); 
httpclient.setHttpRequestRetryHandler(myRetryHandler); 
httpclient.setKeepAliveStrategy(keepAlive); 
HttpGet httpget = new HttpGet("http://remotehost.com"); 
HttpResponse httpres = httpclient.execute(httpget); 
InputStream is = httpres.getEntity().getContent(); 

मुझे आशा है कि इससे मदद मिलती है!

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