Cóż, próbowałem użyć proxy SOCKS na Androidzie. Za dużo się zmagałem i nie udało mi się go poprawnie użyć.Jak korzystać z HttpURLConnection przez proxy SOCKS na Androida
Zasadniczo chcę uzyskać zawartość strony przez proxy SOCKS przy użyciu HttpURLConnection
(jest koniecznością).
Kod używam to:
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();
zrobić dostać SocketTimeOutException
, tutaj jest ślad stosu:
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)
Niektóre ciekawe rzeczy:
- Punkty proxy do mojego tunelu SSH (podobno testowany na innych urządzeniach za pomocą funkcji proxy skarpetek firefox).
- Po zmianie
Proxy.Type
naHTTP
i wybraniu odpowiedniego HttpProxy z Internetu działa, ale potrzebuję skarpet. - Nie przeszkadza
System.out.print
i pętli, jest tam do celów testowych. - urządzenie testowe jest model C6603 i wersja Android 5.1.1
Edit: Wydaje się, że SOCKS proxy nie działa z HttpURLConnection
na Androidzie. Niektóre referencje: Ten thread i ten thread twierdzi tak. Chcę mieć pewność, że istnieje sposób bez korzystania z bibliotek zewnętrznych.
Używasz okhttp. To jest biblioteka innych firm. Nie wiem, jakiej wersji biblioteki używasz, ale okhttp właśnie dodała obsługę SOCKS. Czy próbowałeś użyć wersji 'HttpURLConnection', która jest wbudowana w system Android? –
Cóż, sam nie używam okhttp, natywne "HttpURLConnection" i "HttpsURLConnection" są używane w moim kodzie. może Android wewnętrznie za pomocą okhttp, nie jestem pewien. – guness
Nie sądzę. Na jakim urządzeniu testujesz? –