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

How to use HttpURLConnection over SOCKS proxy on Android

好吧,我一直在尝试在 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[=12=]0(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)

一些奇怪的事情:


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

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

的模拟器检查也失败

所以为了以后参考:

Android 在 Marshmellow 之前的设备上本机不支持 socks 代理(using HURL)