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ànhHTTP
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.
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? –
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
Tôi không nghĩ vậy. Bạn đang thử nghiệm thiết bị nào? –