2016-03-24 7 views
5

Nun, ich habe versucht, SOCKS-Proxy auf Android zu verwenden. Zu viel habe ich gekämpft und ich habe es nicht richtig benutzt.So verwenden Sie HttpURLConnection über SOCKS-Proxy auf Android

Grundsätzlich möchte ich den Inhalt einer Seite über einen SOCKS-Proxy mit HttpURLConnection bekommen (ist ein Muss).

Der Code ich verwende, ist dies:

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(); 

ich SocketTimeOutException tun bekommen, hier ist der Stack-Trace:

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) 

Einige seltsame Dinge:

  • Die Proxy-Punkte zu meinem SSH-Tunnel (anscheinend auf anderen Geräten mit Firefox-Sockets-Proxy-Funktion getestet).
  • Wenn ich Proxy.Type zu HTTP ändern und wählen Sie eine geeignete HttpProxy aus dem Internet funktioniert es, aber ich brauche Socken.
  • Egal und die Schleife, es ist dort zu Testzwecken.
  • Testgerät ist ein C6603-Modell und Android-Version 5.1.1

Edit: Es scheint, dass SOCKS-Proxy nicht mit HttpURLConnection auf Android funktioniert. Einige Referenzen: Diese thread und dies thread behauptet, so. Ich möchte sicher sein, wenn es einen Weg gibt, ohne 3rd-Party-Bibliotheken zu verwenden.

+1

Sie verwenden okhttp. Das ist eine 3rd-Party-Bibliothek. Ich weiß nicht, welche Version der Bibliothek Sie verwenden, aber okhttp SOCKS Unterstützung kürzlich hinzugefügt. Haben Sie versucht, die in Android integrierte Version von "HttpURLConnection" zu verwenden? –

+1

Nun, ich benutze nicht okhttp selbst, die native 'HttpURLConnection' und' HttpsURLConnection' werden auf meinem Code verwendet. vielleicht Android intern mit okhttp, nicht sicher. – guness

+0

Ich glaube nicht. Auf welchem ​​Gerät testen Sie? –

Antwort

1

Ich habe das Problem gefunden, und die Lösung teilweise. Wie in meiner Frage angegeben, war das Gerät Lollipop(5.1.1). Wenn ich einen Emulator verwende, um Marshmallow(6.0) zu überprüfen, arbeitete es wie Charme, ohne irgendeine Änderung. Die Emulatorprüfung schlägt auch fehl für Lollipop.

Also für die zukünftige Referenz:

Android nicht SOCKS-Proxy nativ (using HURL) auf Geräten früheren als Marsh unterstützen.

Verwandte Themen