2016-03-24 26 views
5

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 na HTTP 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.

+1

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? –

+1

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

+0

Nie sądzę. Na jakim urządzeniu testujesz? –

Odpowiedz

1

Znalazłem problem i częściowo rozwiązanie. Jak stwierdzono w moim pytaniu, urządzenie było Lollipop(5.1.1). Kiedy używam emulatora do sprawdzania Marshmallow(6.0), działał jak charm, bez żadnych zmian. Sprawdzenie emulatora również nie powiedzie się dla Lollipop.

Tak dla przyszłości:

Android nie obsługują natywnie (using HURL) Socks Proxy na urządzeniach wcześniejszych niż Marshmellow.