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).

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

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.

  • Controlar el acceso de las API de terceros a los recursos del sistema Android?
  • Fuerza HttpURLConnection para utilizar la red móvil y de retorno a WiFi
  • Titanium Appcelerator módulo Android: ¿Cómo crear un proxy?
  • Android Spring RestTemplate con proxy
  • ¿Hay alguna manera de crear un proxy HTTP en VPN en Android?
  • Proxy androide de WebView
  • Proxy manual en Android a través de la reflexión
  • Configuración de la red del emulador de Android
  • Cómo configurar el gestor de Android SDK con calcetines?
  • Android WebView - con proxy autenticado
  • El host remoto cerró la conexión durante el apretón de manos: Certificado Burp en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.