android - 如何在 Android 上通过 SOCKS 代理使用 HttpURLConnection

标签 android proxy socks

好吧,我一直在尝试在 android 上使用 SOCKS 代理。太多了,我很挣扎,我没能正确使用它。

基本上,我确实想使用 HttpURLConnection(必须)通过 SOCKS 代理获取页面内容。

我使用的代码是这样的:

    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();

我得到了 SocketTimeOutException,这是堆栈跟踪:

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)

一些奇怪的事情:

  • 代理指向我的 SSH 隧道(显然已在使用 firefox socks 代理功能的其他设备上测试过)。
  • 当我将 Proxy.Type 更改为 HTTP 并从互联网上选择合适的 HttpProxy 时,它可以正常工作,但我需要 socks 。
  • 不要介意 System.out.print 和循环,它用于测试目的。
  • 测试设备是 C6603 型号和 Android 版本 5.1.1

编辑: 似乎 SOCKS 代理不适用于 android 上的 HttpURLConnection。一些引用: 这个 thread 和这个 thread 声称如此。我想确定是否有不使用第 3 方库的方法。

最佳答案

我已经找到了问题,并部分解决了。正如我在问题中所述,该设备是 Lollipop(5.1.1)。当我使用模拟器检查 Marshmallow(6.0) 时,它运行得很好,没有任何变化。 Lollipop 的模拟器检查也失败。

所以为了以后的引用:

Android 在 Marshmellow 之前的设备上原生不支持 socks 代理(使用 HURL)

关于android - 如何在 Android 上通过 SOCKS 代理使用 HttpURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36205896/

相关文章:

java - Android 中的 Tensorflow : java. lang.illegalArgumentsException

java - 使用 Class.forName 创建静态数组

Android RelativeLayout 将一个 View 的中心对齐到另一个 View 的右上角

java - 代理服务器配置

Gradle已从服务器: Forbidden接收到状态码403

c++ - 通过 SOCKS 代理发送 UDP 数据包

c# - 通过 SOCKS 代理发出 HTTP 请求

android - 在 flutter 中将图标添加到 DropDownButton(扩展)的左侧

powershell - 如何在代理后面的 Powershell 中使用 FTP 上传?

Ruby SOCKsify 的 Python 等效项