2016-09-24 5 views
10

क्या है मैंने अभी जावा नेटवर्किंग प्रोटोकॉल में काम करना शुरू कर दिया है। मैं अपने प्रॉक्सी सर्वर का उपयोग कर इंटरनेट से कनेक्ट करने की कोशिश कर रहा हूं। जब मैं 'https://www.tutorialspoint.com/javaexamples/net_poxy.htm' पर पोस्ट देखता हूं, तो उन्होंने http.proxyHost प्रॉपर्टी को 'proxy.mycompany1.local' पर सेट किया है। मुझे पता है कि मैं इसे अपने प्रॉक्सी सर्वर आईपी पर सेट कर सकता हूं, लेकिन मुझे यह जानकर उत्सुकता है कि मेरा प्रोग्राम अभी भी क्यों काम करता है, भले ही मैं इसे "abcd" जैसी कुछ यादृच्छिक स्ट्रिंग पर सेट करता हूं।'proxy.mycompany1.local'

ए क्या proxy.mycompany1.local "?

के लिए खड़े बी कैसे आ मेरा कार्यक्रम काम करता है, भले ही मैं सेट http.proxyHost" करता है करने के लिए "एबीसीडी"?

import java.net.HttpURLConnection; 
import java.net.InetSocketAddress; 
import java.net.Proxy; 
import java.net.ProxySelector; 
import java.net.URI; 
import java.net.URL; 

public class TestProxy { 
    public static void main(String s[]) throws Exception { 
     try { 

      System.setProperty("http.proxyHost", "abcd"); 
      System.setProperty("http.proxyPort", "8080"); 

      URL u = new URL("http://www.google.com"); 
      HttpURLConnection con = (HttpURLConnection) u.openConnection(); 
      System.out.println(con.getResponseCode() + " : " + con.getResponseMessage()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(false); 
     } 
     Proxy proxy = (Proxy) ProxySelector.getDefault().select(new URI("http://www.google.com")).iterator().next(); 
     System.out.println("proxy Type : " + proxy.type()); 
     InetSocketAddress addr = (InetSocketAddress) proxy.address(); 
     if (addr == null) { 
      System.out.println("No Proxy"); 
     } else { 
      System.out.println("proxy hostname : " + addr.getHostName()); 
      System.out.println("proxy port : " + addr.getPort()); 
     } 
    } 
} 

यह आउटपुट है:

बाद

मेरे कार्य कार्यक्रम है

सभी की
200 : OK 
proxy Type : HTTP 
proxy hostname : abcd 
proxy port : 8080 

उत्तर

6

सबसे पहले, System Properties tutorial के अनुसार।

चेतावनी: सिस्टम गुणों को बदलना संभावित रूप से खतरनाक है और विवेकानुसार किया जाना चाहिए। स्टार्ट-अप के बाद कई सिस्टम गुण रीड नहीं होते हैं और सूचनात्मक उद्देश्यों के लिए होते हैं। कुछ गुणों को बदलने से अप्रत्याशित दुष्प्रभाव हो सकते हैं।

और मेरे अनुभव कहते हैं कि जब आप *.proxyHost गुणों को बदलने आप अपने सिस्टम पर अप्रिय मुद्दों मिल सकती है। इसलिए मैं आपको इस कार्य के लिए सिस्टम गुणों को बदलने की सलाह नहीं दूंगा।

बहुत बेहतर उपयोग कुछ की तरह:

//Proxy instance, proxy ip = 127.0.0.1 with port 8080 
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080)); 
conn = new URL(urlString).openConnection(proxy); 

और प्रॉक्सी पर प्राधिकरण:

'proxy.mycompany1.local ":

Authenticator authenticator = new Authenticator() { 
     @Override 
     public PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("user", 
        "mypassword".toCharArray()); 
     } 
    }; 
    Authenticator.setDefault(authenticator); 

अब मुख्य सवाल करने के लिए वापस बस उदाहरण है। आप किसी भी होस्टनाम का उपयोग कर सकते हैं

बी क्लास यूआरएल सॉकेट के माध्यम से java.net.PlainSocketImpl क्लास का उपयोग करता है। यह प्रॉक्सी होस्टनाम 'abcd' को हल करने का प्रयास करता है, त्रुटि निगलता है और सीधे Google पर जाता है।आप देख सकते हैं चलाने के समय बड़ा है जब आप setProperty साथ टिप्पणी हटाएं अनुभाग है

import java.net.*; 
import java.io.*; 

public class RequestURI { 

    public static void main(String[] args) { 
     int port = 8181; 
     long startTime = System.currentTimeMillis(); 
     try { 
//   System.getProperties().setProperty("http.proxyHost", "abcd"); 
//   System.getProperties().setProperty("http.proxyPort", Integer.toString(port)); 

      URL url = new URL("http://google.com"); 
      HttpURLConnection uc = (HttpURLConnection) url.openConnection(); 
      int resp = uc.getResponseCode(); 
      if (resp != 200) { 
       throw new RuntimeException("Failed: Fragment is being passed as part of the RequestURI"); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Run time in ms ="+ (System.currentTimeMillis() - startTime)); 
    } 
} 

: बस इस कोड के साथ खेलने के लिए प्रयास करें। होस्टनाम को हल करने के असफल प्रयास निष्पादन समय बढ़ाता है।

3

पहले, proxy.mycompany1.local, बस एक होस्ट नाम है यह एक नमूना है, यह कुछ खास नहीं है।

मैंने आपके कोड को एक गैर-प्रॉक्सी नेटवर्क में करने की कोशिश की, और जैसा आपने वर्णन किया है, यह काम करता है। मुझे लगता है कि url.openConnection() विधि प्रॉक्सी सेटिंग्स को अनदेखा करती है, क्योंकि यदि आप अपनी प्रॉक्सी प्रबंधित करते हैं और url.openConnection(proxy) का उपयोग करते हैं, तो यह java.net.UnknownHostException के साथ विफल रहता है।

यहाँ आप कोड का एक टुकड़ा है कि विफल रहता है के साथ कर रहे हैं:

SocketAddress addr = new InetSocketAddress("abcd", 8080); 
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); 
URL url = new URL("http://google.com"); 
URLConnection conn = url.openConnection(proxy); 
InputStream in = conn.getInputStream(); 
in.close(); 

आप Java Networking and Proxies के बारे में अधिक पढ़ सकते हैं।

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