如何在android应用程序中使用socks5代理?
其目的是在android应用程序中的所有连接中使用socks5。正如这里所说的, 我只需要使用系统属性设置端口、主机名和socks版本:如何在android应用程序中使用socks5代理?,android,proxy,socks,Android,Proxy,Socks,其目的是在android应用程序中的所有连接中使用socks5。正如这里所说的, 我只需要使用系统属性设置端口、主机名和socks版本: System.setProperty("socksProxyHost",addr); System.setProperty("socksProxyPort",port); System.setProperty("socksProxyVersion","5") 然后创建一个连接: protected String doInBackground(String..
System.setProperty("socksProxyHost",addr);
System.setProperty("socksProxyPort",port);
System.setProperty("socksProxyVersion","5")
然后创建一个连接:
protected String doInBackground(String... sUrl) {
OutputStream output = null;
InputStream input = null;
byte data[] = new byte[4096];
int total = 0, fileNameLength = sUrl[0].length();
int count;
try {
// Download file from URL
URL url = new URL(sUrl[0]);
SocketAddress socketAddress;
connection = (HttpsURLConnection)url.openConnection();
//Accepting all certs
TrustManager[] trustManagers = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}
};
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return s.equals(sslSession.getPeerHost());
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagers, null);
connection.setSSLSocketFactory(sslContext.getSocketFactory());
connection.setHostnameVerifier(hostnameVerifier);
input = connection.getInputStream();
但当我嗅探流量时,它总是使用袜子。Http、Https代理按预期工作。然后,如果我使用直接指定的代理调用套接字构造函数,我尝试找出创建的套接字类型:
Socket socket = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyAddr, proxyPort)));
Class clazzSocks = socket.getClass();
Method setSockVersion = null;
Field sockImplField = null;
SocketImpl socksimpl = null;
sockImplField = clazzSocks.getDeclaredField("impl");
sockImplField.setAccessible(true);
socksimpl = (SocketImpl) sockImplField.get(socket);
Class clazzSocksImpl = socksimpl.getClass();
它表明clazzSocksImpl是纯socketImpl,而不是我所期望的socksocketImpl。有人能告诉我我做错了什么吗?你找到解决办法了吗?