[ 登录 ] - [ 注册 ] | 免费代理IP 数据无忧_无忧代理IP_DATA5U最新上线 | 代码示例DEMO | IP测试视频 | 用户协议

Java接入代理IP发送网络请求的几种方法

作者:数据无忧   时间:2022-12-08 15:19:51
无忧代理IP推广返现活动

一、使用全局设置

Java 公开了一组系统属性,可用于配置 JVM 范围内的行为。如果适用于用例,这种“一刀切”的方法通常最容易实施。

我们可以在调用 JVM 时从命令行设置所需的属性作为替代方案,我们也可以通过在运行时调用 System.setProperty()来设置它们。

1.1. 可用的系统属性

Java 为 HTTP、HTTPS、FTP 和 SOCKS 协议提供代理处理程序。可以为每个处理程序定义代理作为主机名和端口号:

  • http.proxyHost – HTTP 代理服务器的主机名
  • http.proxyPort – HTTP 代理服务器的端口号 – 属性是可选的,如果未提供则默认为 80
  • http.nonProxyHosts – 应该绕过代理的主机模式的竖线分隔(“|”)列表 – 如果设置则适用于 HTTP 和 HTTPS 处理程序
  • socksProxyHost – SOCKS 代理服务器的主机名
  • socksProxyPort – SOCKS 代理服务器的端口号

如果指定 nonProxyHosts,主机模式可以以通配符(“*”)开头或结尾。可能需要转义“|” Windows 平台上的分隔符。可以在 Oracle 关于网络属性的官方 Java 文档中找到所有可用的代理相关系统属性的详尽列表。

1.2. 通过命令行参数设置

我们可以通过将设置作为系统属性传递来在命令行上定义代理:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 com.baeldung.networking.proxies.CommandLineProxyDemo

当以这种方式启动一个进程时,我们可以简单地URL上使用openConnection()而无需任何额外的工作:

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();

1.3. 使用System.setProperty(String, String)设置

如果我们无法在命令行上设置代理属性,我们可以在我们的程序中调用System.setProperty()来设置它们:

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "3128");

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();
// ...

如果我们稍后手动取消设置相关的系统属性,那么将不再使用代理:

System.setProperty("http.proxyHost", null);

1.4. 全局配置的限制

尽管使用具有系统属性的全局配置很容易实现,但这种方法限制了我们可以做的事情,因为这些设置适用于整个 JVM出于这个原因,为特定协议定义的设置在 JVM 的生命周期内是有效的,或者直到它们被取消设置。

要绕过此限制,可能很想根据需要打开和关闭设置。为了在多线程程序中安全地执行此操作,有必要引入措施来防止并发问题。

作为替代方案,Proxy API 提供了对代理配置的更精细控制。

二. 使用 代理API

Proxy类为我们提供了一种在每个连接的基础上配置代理的灵活方法如果存在任何现有的 JVM 范围的代理设置,使用Proxy类的基于连接的代理设置将覆盖它们。

我们可以通过Proxy.Type定义三种类型的代理:

  • HTTP – 使用 HTTP 协议的代理
  • SOCKS——使用SOCKS协议的代理
  • DIRECT – 没有代理的明确配置的直接连接

2.1. 使用 HTTP 代理

要使用 HTTP 代理,我们首先使用Proxy 和 Proxy.Type.HTTP类型包装一个SocketAddress实例接下来,我们只需将Proxy实例传递给URLConnection.openConnection():

URL weburl = new URL(URL_STRING);
Proxy webProxy 
  = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
HttpURLConnection webProxyConnection 
  = (HttpURLConnection) weburl.openConnection(webProxy);

简而言之,这意味着我们将连接到 URL_STRING,然后通过托管在 127.0.0.1:3128的代理服务器路由该连接。

2.2. 使用直接代理

我们可能需要直接连接到主机。在这种情况下,我们可以使用静态Proxy.NO_PROXY实例显式绕过可能在全局配置的代理 。在幕后,API 为我们构造了一个新的Proxy实例,使用Proxy.Type.DIRECT作为类型

HttpURLConnection directConnection 
  = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);

基本上,如果没有全局配置的代理,那么这 与不带参数调用openConnection() 是一样的。

2.3. 使用 SOCKS 代理

使用URLConnection时,使用 SOCKS 代理类似于 HTTP 变体。 我们首先使用Proxy.Type.SOCKS类型用Proxy包装SocketAddress实例之后,我们将Proxy实例传递给 URLConnection.openConnection

Proxy socksProxy 
  = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
HttpURLConnection socksConnection 
  = (HttpURLConnection) weburl.openConnection(socksProxy);

连接到 TCP 套接字时也可以使用 SOCKS 代理首先,我们使用Proxy实例构造一个Socket之后,我们将目标SocketAddress实例传递给Socket.connect()

Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost 
  = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
proxySocket.connect(socketHost);

三.结论

在本文中,我们研究了如何在核心 Java 中使用代理IP服务器。

首先,我们研究了使用系统属性通过代理服务器进行连接的更旧的、更全局的连接方式。然后,我们看到了如何使用Proxy类,它在通过代理服务器连接时提供细粒度的控制。


福利:现在通过开发者购买代理IP,购买后联系客服最高可获   返现20%   到你的支付宝(最低35元,最高1440元)
无忧代理IP(www.data5u.com)原创文章,转载请注明出处。

微信公众号
关注微信公众号