まあ、私はアンドロイドでSOCKSプロキシを使用しようとしています。あまりにも私は苦労して、それを正しく使用することができませんでした。HttpURLConnectionを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を選択すると機能しますが、私は靴下が必要です。System.out.print
とループは気にしないでください。テスト目的であります。- テストデバイスは、C6603モデルとAndroidのバージョンである5.1.1
編集: それはSOCKSプロキシは、Android上HttpURLConnection
では動作しないようです。いくつかの参照: これはthreadとこのthreadはそうです。サードパーティのライブラリを使用しない方法があるかどうかを確認したい。
あなたはokhttpを使用しています。それは第三者図書館です。あなたが使用しているライブラリのバージョンはわかりませんが、okhttpは最近SOCKSサポートを追加しました。 Androidに組み込まれている 'HttpURLConnection'のバージョンを使ってみましたか? –
さて、私は自分でokhttpを使っていません。ネイティブの 'HttpURLConnection'と' HttpsURLConnection'が自分のコードで使われています。おそらくアンドロイドは内部的にokhttpを使っています。 – guness
私はそうは思わない。どのデバイスをテストしていますか? –