【问题标题】:How to make all network traffic go via a proxy?如何使所有网络流量通过代理?
【发布时间】:2013-06-25 06:54:22
【问题描述】:

我有一个向远程服务器发出 http 请求的应用程序。我使用以下代码执行此操作:

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("myURL");

    try {

        ArrayList<BasicNameValuePair> postVariables = new ArrayList<BasicNameValuePair>(2);
        postVariables.add(new BasicNameValuePair("key","value"));

        httpPost.setEntity(new UrlEncodedFormEntity(postVariables));
        HttpResponse response = httpClient.execute(httpPost);
        String responseString = EntityUtils.toString(response.getEntity());

        if (responseString.contains("\"success\":true")){
            //this means the request succeeded
        } else {
            //failed
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

这非常顺利,但我们的一位客户设置了一个 APN,要求请求通过某个代理服务器。如果我将以下内容添加到有效的请求中,则请求会通过代理重新路由到服务器:

    HttpHost httpHost = new HttpHost("proxyURL",8080);
    httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, httpHost);

到目前为止,一切都很好,但是,我使用的库也可以发出一些 http 请求。我无法访问该库的代码,因此我无法将这两行添加到代码中。我联系了该库的创建者,他们告诉我应该可以设置 android 环境,以便所有请求都会自动通过代理。有没有类似的东西?我在谷歌上没有找到任何东西。
我基本上是在寻找一种将上述两行设置为所有 http 请求的标准的方法。请注意,APN 不会将代理设置为整个手机的默认设置,因此应用必须手动执行此操作(是的,这意味着大多数应用无法在该客户的手机上运行)。

【问题讨论】:

  • 您现在可能不记得了,但是您是否找到了可以通过代理重定向所有设备网络流量的代码?如果可以的话可以分享一下代码吗?
  • @sak 对不起,我什至不知道我是否能正常工作。你试过大卫的答案吗?请记住,这是 5 年前提出的问题,从那时起 Android 发生了很大变化。
  • 是的,我知道,但我没有得到任何解决方案,尝试了很长时间,根据大卫的说法,我认为不可能将所有设备流量重定向到代理,因为他提到“每个应用程序都运行在它自己的 Dalvik 中,所以你不会影响其他应用程序的网络通信”。但至少感谢您的回复。
  • @sak 祝你好运,我记得我最初问这个是因为我需要一种通过应用程序控制它的方法(锁定企业应用程序在根本没有管理的公司手机上,但必须连接通过 APN 获取相关数据),但手机本身的代理设置已经允许这样做。仅使用手机的设置是否适合您?
  • 是的,我可以使用手机设置,但它也不适用于所有应用程序,我之前尝试过。

标签: java android http networking proxy


【解决方案1】:


自从我需要使用它已经有一两年了,但如果我没记错的话,您可以使用System.setProperty(String, String) 为您的应用程序设置一个环境范围的设置,以通过代理路由所有 HTTP 流量。您需要设置的属性是“http.proxyHost”和“http.proxyPort”,然后正常使用 HttpClient 而不指定代理,因为 VM 将处理路由请求。
有关我正在谈论的内容的更多信息的文档可以在这里找到:ProxySelector (just so you know what keys to use)here 有关实际 System.setProperty(String, String) 函数的文档
如果这对您不起作用,请告诉我,我将尝试挖掘设置系统级代理的旧代码。顺便说一句,这实际上只是“系统级”,因为每个应用程序都在自己的 Dalvik 中运行,因此您不会影响其他应用程序的网络通信。

【讨论】:

  • 谢谢,我去看看,确实是我需要的。我不想影响其他应用:)。
  • 我还不能测试这个,但我阅读了你的建议,我认为这是正确的方法。将标记为已回答,谢谢。
  • 有人让这个工作吗?仍然无法让它工作。试过 http.ProxyHost http.ProxyPort https.ProxyHost 和 https.ProxyPort。无法让它工作。任何人都可以提供一个示例来显示所使用的值吗?
猜你喜欢
  • 2018-08-17
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多