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
zuHTTP
ä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.
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? –
Nun, ich benutze nicht okhttp selbst, die native 'HttpURLConnection' und' HttpsURLConnection' werden auf meinem Code verwendet. vielleicht Android intern mit okhttp, nicht sicher. – guness
Ich glaube nicht. Auf welchem Gerät testen Sie? –