Cómo utilizar HttpURLConnection sobre proxy SOCKS en Android
Bueno, he estado tratando de usar SOCKS proxy en android. Demasiado soy luchado y no lo utilicé correctamente.
Básicamente quiero conseguir un contenido de una página sobre un proxy de SOCKS usando HttpURLConnection
(es una necesidad).
- Configuración del proxy para la clase DownloadManager de android
- Configuración de HTTP Proxy para redes WIFI en dispositivos Android 1.xy 2.x
- Recursos de documentación confusos de proxy de Android
- No se pudieron resolver todas las dependencias para la configuración ': classpath'
- Roboblender-3.0.1.jar: no incluido en Android: javax.tools. Referido desde com.google.inject.blender.AnnotationDatabaseGenerator
El código que estoy usando es este:
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();
Hago SocketTimeOutException
, aquí está el rastro de la pila:
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)
Algunas cosas curiosas:
- El proxy apunta a mi túnel SSH (aparentemente probado en otros dispositivos que utilizan la característica de proxy fireocks de los calcetines).
- Cuando cambio
Proxy.Type
aHTTP
y elijo un HttpProxy apropiado de Internet funciona, pero necesito calcetines. - No importa
System.out.print
y el bucle, está ahí para propósitos de prueba. - El dispositivo de prueba es un modelo C6603 y Android versión 5.1.1
Edit: Parece que SOCKS proxy no funciona con HttpURLConnection
en android. Algunas referencias: Este hilo y este hilo afirma así. Quiero estar seguro de si hay una manera sin usar bibliotecas de terceros.
- ¿Cómo pueden los usuarios / desarrolladores configurar la configuración de proxy de Android para las versiones 2.x?
- Configuración de SDK de Android con ubuntu
- ¿Cómo puedo conectarme a un proxy en Android?
- Notificación push con proxy
- Charles Proxy para Genymotion detiene 10.0.3.2 tráfico localhost
- Buffer de flujo de audio
- Transmisión con Android MediaPlayer en SDK 8
- Force Gradle para usar HTTP en lugar de HTTPS
He encontrado el problema, y la solución parcialmente. Como se dijo en mi pregunta, el dispositivo fue Lollipop(5.1.1)
. Cuando utilizo un emulador para comprobar Marshmallow(6.0)
estaba funcionando como encanto, sin ningún cambio. La comprobación del emulador también falla para Lollipop
.
Así que para la futura referencia:
Android no soporta nativo socks (using HURL)
en los dispositivos anteriores a Marshmellow.