2010-02-01 9 views
5

मैं जावा webservice एप्लिकेशन (जेएक्स-डब्ल्यूएस के साथ) विकसित कर रहा हूं जिसे इंटरनेट और इंट्रानेट से अलग कनेक्शन स्थापित करने के लिए दो अलग-अलग प्रॉक्सी का उपयोग करना है। समाधान के रूप में मैंने अपना खुद का java.net लिखने की कोशिश की। PrroxySelector जो java.net लौटाता है। इंटरनेट या इंट्रानेट के लिए प्रॉक्सी इंस्टेंस (प्रकार HTTP)।विशिष्ट पते पर विभिन्न प्रॉक्सी से कनेक्ट करना

थोड़ा परीक्षण आवेदन में मैं URL.openConnection() के माध्यम से वेबपृष्ठ डाउनलोड करने का प्रयास करता हूं, और इससे पहले कि मैंने डिफ़ॉल्ट प्रॉक्सी चयनकर्ता को अपने साथ बदल दिया।

java.net.SocketException:: अज्ञात प्रॉक्सी के प्रकार: लेकिन यह एक अपवाद में परिणाम HTTP java.net.SocksSocketImpl.connect (SocksSocketImpl.java:370) पर java.net.Socket.connect पर (सॉकेट.जावा 1 9 1) java.net.Socket.connect (सॉकेट.जावाश 6 9 6) sun.net पर। NetworkClient.do कनेक्ट (NetworkClient.java:163) sun.net पर .www.http.HttpClient। sunServer (HttpClient.java:394) sun.net पर .www.http.HttpClient.openServer (HttpClient.java:5229) sun.net पर .www.http.HttpClient। (HttpClient.java3333) सूरज पर .NET.www.http.HttpClient.New (HttpClient.java:306) sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient (HttpURLConnection.java:844) sun.net पर .www.protocol.http.HttpURLConnection.plain कनेक्ट (HttpURLConnection.java:792) sun.net पर। www.protocol.http.HttpURLConnection.connect (HttpURLConnection.java:703) sun.net पर .www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1026) java.net पर। HttpURLConnection.getResponseCode (HttpURLConnection। जावा: 373) norman.test.ProxyTest.conntectToRmViaProxy (ProxyTest.java:42 पर ) norman.test.ProxyTest.main (ProxyTest.java:65 पर)

  1. प्रश्न: " सॉक्स के माध्यम से कनेक्शन स्थापित करने का प्रयास क्यों करता है, अगर मेरा प्रॉक्सी चयनकर्ता केवल HTTP प्रॉक्सी देता है? "

2 प्रश्न: "क्या प्रत्येक विकल्प के लिए अलग-अलग प्रॉक्सी परिभाषित करने के लिए कोई विकल्प है?"

public class ProxyTest { 
OwnProxySelector ownSelector = new OwnProxySelector(); 

public ProxyTest(){ 
    ownSelector.setIntranetProxy("intranet.proxy", 8123); 
    try { 
     ownSelector.setIntranetAddress("http://intranet:80"); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    ownSelector.setExtranetProxy("", 0); 
    try { 
     ownSelector.setExtranetAddress("http://www.example.com:80"); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    ProxySelector.setDefault(ownSelector); 
} 

public void conntectToRmViaProxy(boolean internal, String connectAddress){ 
    try { 
     URL url = new URL(connectAddress); 

     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 

     conn.setRequestMethod("GET"); 
      if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
      System.out.println(conn.getResponseMessage()); 
      } 
      else{ 
       BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       int tmp = reader.read(); 
       while(tmp != -1){ 
        System.out.print((char)tmp); 
        tmp = reader.read(); 
       } 
      } 

    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public static void main(String[] args){ 
    ProxyTest proxyText = new ProxyTest(); 
    proxyText.conntectToRmViaProxy(true, "http://intranet:80"); 
} 
} 
+0

क्या वास्तव में इस पर कोई संकेत नहीं है? –

उत्तर

5

ठीक है, मैं इस समस्या पाया है:

public class OwnProxySelector extends ProxySelector { 
private Proxy intranetProxy; 
private Proxy extranetProxy; 
private Proxy directConnection = Proxy.NO_PROXY; 
private URI intranetAddress; 
private URI extranetAddress; 

/* (non-Javadoc) 
* @see java.net.ProxySelector#connectFailed(java.net.URI, java.net.SocketAddress, java.io.IOException) 
*/ 
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 
    // Nothing to do 
} 

/* (non-Javadoc) 
* @see java.net.ProxySelector#select(java.net.URI) 
*/ 
public List select(URI uri) { 
    ArrayList<Proxy> result = new ArrayList<Proxy>(); 

    if(intranetAddress.getHost().equals(uri.getHost()) && intranetAddress.getPort()==uri.getPort()){ 
     result.add(intranetProxy); 
     System.out.println("Adding intranet Proxy!"); 
    } 
    else if(extranetAddress.getHost().equals(uri.getHost()) && extranetAddress.getPort()==uri.getPort()){ 
     result.add(extranetProxy); 
     System.out.println("Adding extranet Proxy!"); 
    } 
    else{ 
     result.add(directConnection); 
     System.out.println("Adding direct connection!"); 
    } 

    return result; 
} 

public void setIntranetProxy(String proxyAddress, int proxyPort){ 
    if(proxyAddress==null || proxyAddress.isEmpty()){ 
     intranetProxy = Proxy.NO_PROXY; 
    } 
    else{ 
     SocketAddress address = new InetSocketAddress(proxyAddress, proxyPort); 
     intranetProxy = new Proxy(Proxy.Type.HTTP, address); 
    } 
} 

public void setExtranetProxy(String proxyAddress, int proxyPort){ 
    if(proxyAddress==null || proxyAddress.isEmpty()){ 
     extranetProxy = Proxy.NO_PROXY; 
    } 
    else{ 
     SocketAddress address = new InetSocketAddress(proxyAddress, proxyPort); 
     extranetProxy = new Proxy(Proxy.Type.HTTP, address); 
    } 
} 

public void clearIntranetProxy(){ 
    intranetProxy = Proxy.NO_PROXY; 
} 

public void clearExtranetProxy(){ 
    extranetProxy = Proxy.NO_PROXY; 
} 

public void setIntranetAddress(String address) throws URISyntaxException{ 
    intranetAddress = new URI(address); 
} 

public void setExtranetAddress(String address) throws URISyntaxException{ 
    extranetAddress = new URI(address); 
} 
} 

यह परीक्षण वर्ग है:

यह मेरा ProxySelector है।

अनुरोधित यूआरएल में पोर्ट नहीं होने पर HttpURLConnection ने OwnProxySelector.select() दो बार किया था।

पहले, HttpURLConnection ने "http" की योजना के साथ एक यूआरआई के साथ चयन() को बुलाया लेकिन कोई पोर्ट नहीं। चयन() जांचता है कि होस्ट पता और पोर्ट intranet एड्रेस या extranet एड्रेस के लिए euqal हैं या नहीं। यह मेल नहीं खाता था, क्योंकि बंदरगाह नहीं दिया गया था। तो सीधा कनेक्शन के लिए चयन प्रॉक्सी वापस करें।

दूसरे HttpURLConnection ने "सॉकेट" और पोर्ट 80 की योजना के साथ एक यूआरआई के साथ चयन() का आह्वान किया। इसलिए, क्योंकि चयन() मेजबान पता और बंदरगाह की जांच करता है, लेकिन योजना नहीं, यह एक HTTP प्रॉक्सी।

अब यहां मेराप्रोक्सी चयनकर्ता का मेरा सही संस्करण है। यह योजना को जांचता है और यूआरआई द्वारा पोर्ट नहीं दिया जाता है तो HTTP या HTTPS के लिए डिफ़ॉल्ट पोर्ट सेट करता है। यह जावा मानक प्रॉक्सी चयनकर्ता से पूछता है, अगर कोई HTTP या HTTPS योजना नहीं दी जाती है।

public class OwnProxySelector extends ProxySelector { 
private ProxySelector defaultProxySelector; 
private Proxy intranetProxy; 
private Proxy extranetProxy; 
private Proxy directConnection = Proxy.NO_PROXY; 
private URI intranetAddress; 
private URI extranetAddress; 


public OwnProxySelector(ProxySelector defaultProxySelector){ 
    this.defaultProxySelector = defaultProxySelector; 
} 

/* (non-Javadoc) 
* @see java.net.ProxySelector#connectFailed(java.net.URI, java.net.SocketAddress, java.io.IOException) 
*/ 
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { 
    // Nothing to do 
} 

/* (non-Javadoc) 
* @see java.net.ProxySelector#select(java.net.URI) 
*/ 
public List select(URI uri) { 
    ArrayList<Proxy> result = new ArrayList<Proxy>(); 

    if(uri.getScheme().equalsIgnoreCase("http") || uri.getScheme().equalsIgnoreCase("https")){ 
     int uriPort = uri.getPort(); 

     // set default http and https ports if port is not given in URI 
     if(uriPort<1){ 
      if(uri.getScheme().equalsIgnoreCase("http")){ 
       uriPort = 80; 
      } 
      else if(uri.getScheme().equalsIgnoreCase("http")){ 
       uriPort = 443; 
      } 
     } 

     if(intranetAddress.getHost().equals(uri.getHost()) && intranetAddress.getPort()==uriPort){ 
      result.add(intranetProxy); 
      System.out.println("Adding intranet Proxy!"); 
     } 
     else if(extranetAddress.getHost().equals(uri.getHost()) && extranetAddress.getPort()==uriPort){ 
      result.add(extranetProxy); 
      System.out.println("Adding extranet Proxy!"); 
     } 
    } 

    if(result.isEmpty()){ 
     List<Proxy> defaultResult = defaultProxySelector.select(uri); 
     if(defaultResult!=null && !defaultResult.isEmpty()){ 
      result.addAll(defaultResult); 
      System.out.println("Adding Proxis from default selector."); 
     } 
     else{ 
      result.add(directConnection); 
      System.out.println("Adding direct connection, because requested URI does not match any Proxy"); 
     } 
    } 

    return result; 
} 

public void setIntranetProxy(String proxyAddress, int proxyPort){ 
    if(proxyAddress==null || proxyAddress.isEmpty()){ 
     intranetProxy = Proxy.NO_PROXY; 
    } 
    else{ 
     SocketAddress address = new InetSocketAddress(proxyAddress, proxyPort); 
     intranetProxy = new Proxy(Proxy.Type.HTTP, address); 
    } 
} 

public void setExtranetProxy(String proxyAddress, int proxyPort){ 
    if(proxyAddress==null || proxyAddress.isEmpty()){ 
     extranetProxy = Proxy.NO_PROXY; 
    } 
    else{ 
     SocketAddress address = new InetSocketAddress(proxyAddress, proxyPort); 
     extranetProxy = new Proxy(Proxy.Type.HTTP, address); 
    } 
} 

public void clearIntranetProxy(){ 
    intranetProxy = Proxy.NO_PROXY; 
} 

public void clearExtranetProxy(){ 
    extranetProxy = Proxy.NO_PROXY; 
} 

public void setIntranetAddress(String address) throws URISyntaxException{ 
    intranetAddress = new URI(address); 
} 

public void setExtranetAddress(String address) throws URISyntaxException{ 
    extranetAddress = new URI(address); 
} 

}

लेकिन यह मेरे लिए उत्सुक है, कि HttpURLConnection,) का चयन की एक दूसरी आह्वान (किया जब वह पहली बार आह्वान से एक सीधा संबंध प्रॉक्सी मिला है।

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