好吧,我一直在尝试在 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/