2016-03-24 17 views
5

まあ、私はアンドロイドで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.TypeHTTPに変更し、インターネットから適切なHttpProxyを選択すると機能しますが、私は靴下が必要です。
  • System.out.printとループは気にしないでください。テスト目的であります。
  • テストデバイスは、C6603モデルとAndroidのバージョンである5.1.1

編集: それはSOCKSプロキシは、Android上HttpURLConnectionでは動作しないようです。いくつかの参照: これはthreadとこのthreadはそうです。サードパーティのライブラリを使用しない方法があるかどうかを確認したい。

+1

あなたはokhttpを使用しています。それは第三者図書館です。あなたが使用しているライブラリのバージョンはわかりませんが、okhttpは最近SOCKSサポートを追加しました。 Androidに組み込まれている 'HttpURLConnection'のバージョンを使ってみましたか? –

+1

さて、私は自分でokhttpを使っていません。ネイティブの 'HttpURLConnection'と' HttpsURLConnection'が自分のコードで使われています。おそらくアンドロイドは内部的にokhttpを使っています。 – guness

+0

私はそうは思わない。どのデバイスをテストしていますか? –

答えて

1

私は問題と解決策を部分的に見つけました。私の質問に記載されているように、デバイスはLollipop(5.1.1)でした。私がエミュレータを使用してMarshmallow(6.0)をチェックすると、変更なしでチャームのように機能していました。エミュレータチェックもLollipopで失敗します。今後の参考のためにそう

Androidのネイティブ(using HURL) Marshmellowより前のデバイス上でSOCKSプロキシをサポートしていませんでした。

関連する問題