2016-03-24 11 views
5

Bene, ho cercato di utilizzare il proxy SOCKS su Android. Troppo sono faticato e non sono riuscito a usarlo correttamente.Come utilizzare HttpURLConnection su proxy SOCKS su Android

Fondamentalmente voglio ottenere un contenuto di una pagina su un proxy SOCKS utilizzando HttpURLConnection (è un must).

Il codice che sto usando è questo:

String proxyHost = "192.168.2.2"; 
    int proxyPort = 1999; 
    InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort); 
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr); 

    URL request = new URL("http://requestb.in/sgjga5sg"); 

    HttpURLConnection urlConnection = (HttpURLConnection) request.openConnection(proxy); 
    urlConnection.setDoInput(true); 
    urlConnection.setConnectTimeout(36000); 
    urlConnection.setReadTimeout(44000); 

    InputStream is = urlConnection.getInputStream(); 

    for (int x = is.read(); x >= 0; x = is.read()) { 
     System.out.print((char) x); 
    } 
    System.out.println(); 

io capisco SocketTimeOutException, qui è l'analisi dello stack:

java.net.SocketTimeoutException 
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37) 
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237) 
at java.net.PlainSocketImpl.socksReadReply(PlainSocketImpl.java:440) 
at java.net.PlainSocketImpl.socksRequestConnection(PlainSocketImpl.java:340) 
at java.net.PlainSocketImpl.socksConnect(PlainSocketImpl.java:326) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:181) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456) 
at java.net.Socket.connect(Socket.java:887) 
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174) 
at com.android.okhttp.Connection.connect(Connection.java:152) 
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276) 
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332) 
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199) 
at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25) 
at com.guness.testsocks.MainActivity.doTheThing(MainActivity.java:81) 

Alcune cose curiose:

  • I punti del proxy al mio tunnel SSH (apparentemente testato su altri dispositivi che utilizzano la funzione proxy firefox socks).
  • Quando cambio Proxy.Type in HTTP e scelgo un HttpProxy appropriato da internet funziona, ma ho bisogno di calze.
  • Non importa System.out.print e il ciclo, è lì per scopo di test.
  • dispositivo di prova è un modello C6603 e la versione Android 5.1.1

Edit: Sembra che proxy SOCKS non funziona con HttpURLConnection su android. Alcuni riferimenti: Questo thread e questo thread rivendicano così. Voglio essere sicuro che ci sia un modo senza usare le librerie di terze parti.

+1

Si sta utilizzando okhttp. Questa è una libreria di terze parti. Non so quale versione della libreria stai usando, ma okhttp ha appena aggiunto il supporto SOCKS di recente. Hai provato a utilizzare la versione di 'HttpURLConnection' incorporata in Android? –

+1

Beh, non sto usando okhttp da solo, il codice nativo 'HttpURLConnection' e' HttpsURLConnection' sono usati sul mio codice. forse Android internamente usando okhttp, non è sicuro. – guness

+0

Io non la penso così. Su quale dispositivo stai provando? –

risposta

1

Ho trovato il problema e la soluzione parzialmente. Come affermato nella mia domanda, il dispositivo era Lollipop(5.1.1). Quando uso un emulatore per controllare Marshmallow(6.0) funzionava come un incantesimo, senza alcuna modifica. Anche il controllo dell'emulazione fallisce per Lollipop.

Quindi per il riferimento futuro:

Android non supporta nativamente proxy SOCKS (using HURL) su dispositivi precedenti rispetto Marshmellow.

Problemi correlati