2016-03-24 19 views
5

Vâng, tôi đã cố gắng sử dụng SOCKS proxy trên Android. Quá nhiều tôi đang đấu tranh và tôi không sử dụng nó một cách chính xác.Làm thế nào để sử dụng HttpURLConnection trên SOCKS proxy trên Android

Về cơ bản, tôi muốn lấy nội dung của trang trên proxy SOCKS sử dụng HttpURLConnection (là phải).

Mã Tôi đang sử dụng là:

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

tôi làm được SocketTimeOutException, đây là stack trace:

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) 

Một số điều tò mò:

  • Những điểm ủy quyền vào đường hầm SSH của tôi (dường như đã được thử nghiệm trên các thiết bị khác sử dụng tính năng proxy vớ firefox).
  • Khi tôi thay đổi Proxy.Type thành HTTP và chọn HttpProxy thích hợp từ internet, nó hoạt động, nhưng tôi cần tất.
  • Đừng bận tâm System.out.print và vòng lặp, nó có sẵn cho mục đích thử nghiệm.
  • thiết bị thử nghiệm là một mô hình C6603 và phiên bản Android 5.1.1

Edit: Dường như SOCKS proxy không làm việc với HttpURLConnection trên Android. Một số tham chiếu: Điều này thread và điều này thread tuyên bố như vậy. Tôi muốn chắc chắn nếu có cách nào mà không sử dụng thư viện của bên thứ ba.

+1

Bạn đang sử dụng okhttp. Đó là thư viện của bên thứ 3. Tôi không biết bạn đang sử dụng phiên bản thư viện nào, nhưng okhttp vừa mới thêm hỗ trợ SOCKS gần đây. Bạn đã thử sử dụng phiên bản 'HttpURLConnection' được tích hợp vào Android chưa? –

+1

Vâng, tôi không sử dụng okhttp bản thân mình, bản địa 'HttpURLConnection' và' HttpsURLConnection' được sử dụng trên mã của tôi. có lẽ android nội bộ bằng cách sử dụng okhttp, không chắc chắn. – guness

+0

Tôi không nghĩ vậy. Bạn đang thử nghiệm thiết bị nào? –

Trả lời

1

Tôi đã tìm thấy sự cố và giải pháp một phần. Như đã nêu trong câu hỏi của tôi, thiết bị là Lollipop(5.1.1). Khi tôi sử dụng trình mô phỏng để kiểm tra Marshmallow(6.0), nó hoạt động như sự quyến rũ, mà không có bất kỳ thay đổi nào. Kiểm tra giả lập cũng không thành công cho Lollipop.

Vì vậy, đối với tài liệu tham khảo trong tương lai:

Android không hỗ trợ SOCKS proxy natively (using HURL) trên các thiết bị cũ hơn Marshmellow.

Các vấn đề liên quan