Java网络代理

网络代理

yue-library提供对Java全局网络代理的便捷配置,与代理服务器信息获取,优雅解决内网服务器环境的服务通信难题。

知识提要

代理服务器推荐使用:squid或socks代理服务器

Java全局代理配置对部分SDK不生效,已知需要单独处理的jar包有:

  • aliyun-java-sdk-core(阿里云短信等)

代理服务器配置

重要说明:yue-library提供的是代理服务器配置,而非代理协议配置。

  • 配置HTTP代理服务器可代理HTTP协议
  • 配置HTTPS代理服务器可代理HTTPS协议
  • 配置FTP代理服务器可代理FTP协议
  • 配置SOCKS代理服务器可代理HTTP、HTTPS、FTP、SOCKET协议
yue:
  net:
    proxy:
      enabled: true                         # 启用Java全局网络代理自动配置(此项值为true,下面的配置才会生效)
	  
	  # 配置HTTP代理服务器
      http-server-enabled: true             # 启用HTTP代理服务器进行HTTP请求代理访问
      http-server-host: 127.0.0.1           # HTTP代理服务器Host
      http-server-port: 80                  # HTTP代理服务器Port
	  
	  # 配置HTTPS代理服务器
      https-server-enabled: true            # 启用HTTPS代理服务器进行HTTPS请求代理访问
      https-server-host: 127.0.0.1          # HTTPS代理服务器Host
      https-server-port: 443                # HTTPS代理服务器Port
	  
	  # 配置FTP代理服务器
      ftp-server-enabled: true              # 启用FTP代理服务器进行FTP请求代理访问
      ftp-server-host: 127.0.0.1            # FTP代理服务器Port
      ftp-server-port: 80                   # FTP代理服务器Port
	  
	  # 配置SOCKS代理服务器
      socks-server-enabled: true            # 启用SOCKS代理服务器进行HTTP、HTTPS、FTP、SOCKET请求代理访问
      socks-server-host: 127.0.0.1          # SOCKS代理服务器Host
      socks-server-port: 1080               # SOCKS代理服务器Port
      socks-proxy-version: 5                # SOCKS代理协议版本
	  
	  # 更多配置
      non-proxy-hosts: localhost|127.*|[::1]|0.0.0.0|[::0]      # 忽略代理地址,适用于发起HTTP、HTTPS、FTP、SOCKET请求时不进行代理访问(优先级高于其它配置)
      non-proxy-hosts-additional: ai.ylyue.cn|*.ylyue.cn        # 额外忽略地址(适用于不想覆盖默认值进行配置) 
      basic-authenticator-username: ylyue                       # 使用Basic认证方式,连接代理服务器的username
      basic-authenticator-password: ylyue                       # 使用Basic认证方式,连接代理服务器的password

更多功能

参考上述示例对代理服务器进行配置之后,即可实现Java全局网络代理,但如果还有更多特殊需求,可以结合下面提供的方法实现需求。

使用系统代理: 在Windows系统、macOS系统和Gnome系统上,可以告诉java.net堆栈,将该属性设置为true,以使用系统代理设置(这两个系统都允许通过它们的用户界面全局设置代理)。注意,此属性只在启动时检查一次。

public static void main(String[] args) throws Exception {
	NetProxy.useSystemProxies();// 使用系统代理需要在项目启动之前进行设置
	SpringApplication.run(TestApplication.class, args);
}

动态开启与关闭全局代理

@Autowired
NetProxy netProxy;

public void use() {
	netProxy.httpServerEnable();
	netProxy.httpServerClose();
	netProxy.socksServerEnable();
	netProxy.socksServerClose();
	// https、ftp ...
}

获取代理配置

@Autowired
NetProxyProperties netProxyProperties;
public void getProxyConfig() {
	netProxyProperties.getSocksServerHost();
	netProxyProperties.getSocksServerPort();
	netProxyProperties.getSocksProxyVersion();
	netProxyProperties.getNonProxyHosts();
	netProxyProperties.getNonProxyHostsAdditional();
	netProxyProperties.getBasicAuthenticatorUsername();
	netProxyProperties.getBasicAuthenticatorPassword();
	// http、https、ftp ...
}

帮助

Java全局网络代理知识

Java Networking and Proxies

Networking Properties

ProxySelector

阿里云代理配置

HttpClientConfig config = HttpClientConfig.getDefault();
config.setHttpProxy("http://ylyue:80");
config.setHttpsProxy("http://ylyue:80");
profile.setHttpClientConfig(config);

aliyun-spring-boot SMS Example

代理配置参考1

代理配置参考2

Docker网络代理

docker网络代理分为 docker自身网络代理配置docker容器内部网络代理配置,这两点很容易让人混淆,区别如下:

docker自身网络代理

  • 如:docker pull命令

docker容器内部网络代理

  • 如:docker exec进入容器内部之后使用curl命令(curl命令默认开启系统代理,即配置docker容器网络代理)
  • 如:容器内部运行的java -jar程序(Java程序默认不使用系统代理,需手动开启)

Linux网络代理

环境变量描述值示例
http_proxy为http变量设置代理,不填开头默认以http协议传输10.20.56.32:8000
user:pass@192.168.31.10:8080
socks5://10.20.48.254:1080
https_proxy为http变量设置代理同上
ftp_proxy为http变量设置代理同上
socket_proxy为http变量设置代理同上
all_proxy全局变量设置代理,配置了这个变量,上面的就不要设置了。同上
no_proxy1、无需代理的主机名或域名;
2、不支持使用通配符*以及网络范围(CIDR)表示法;
3、多个的时候,使用,号分割;
www.baidu.com,192.168.3.29,localhost,127.0.0.1,0.0.0.0

注意: no_proxy并不支持使用通配符*以及网络范围(CIDR)表示法,故此以下示例中采用穷举法列举IP。

vi /etc/profile

export all_proxy=192.168.0.2:3128 # 代理服务器地址及认证信息

no_proxy_local=localhost,127.0.0.1,0.0.0.0,10.0.0.0/8
no_proxy_1=192.168.3.1
no_proxy_2=$(echo 192.168.0.{65..69} | sed 's/ /,/g')
no_proxy_3=$(echo 10.15.65.{90..110} | sed 's/ /,/g')

export no_proxy=${no_proxy_local},${no_proxy_1},${no_proxy_2},${no_proxy_3} # 不需要代理的IP

source /etc/profile && curl www.baidu.com

结语

解决自身项目中的Java网络代理问题,可以选择按照上面介绍的使用方式依赖yue-library-base模块,或者参考yue-library的实现把相关代码搬运到自身项目中,解决网络代理问题。注意不代理配置一定要配置哦,减少不必要的网络开销。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现Java网络代理,可以使用Java提供的Socket类和ServerSocket类。以下是一个简单的示例代码: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ProxyServer { private static final int PROXY_PORT = 8080; private static final String TARGET_HOST = "目标主机的IP地址"; private static final int TARGET_PORT = 80; public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(PROXY_PORT); while (true) { Socket clientSocket = serverSocket.accept(); Thread proxyThread = new Thread(() -> { try { // 连接目标主机 Socket targetSocket = new Socket(TARGET_HOST, TARGET_PORT); // 处理客户端请求 Thread clientThread = new Thread(() -> handleRequest(clientSocket.getInputStream(), targetSocket.getOutputStream())); clientThread.start(); // 处理目标主机响应 handleResponse(targetSocket.getInputStream(), clientSocket.getOutputStream()); // 等待线程完成 clientThread.join(); // 关闭连接 targetSocket.close(); clientSocket.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }); proxyThread.start(); } } catch (IOException e) { e.printStackTrace(); } } private static void handleRequest(InputStream clientInput, OutputStream targetOutput) { try { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = clientInput.read(buffer)) != -1) { targetOutput.write(buffer, 0, bytesRead); targetOutput.flush(); } } catch (IOException e) { e.printStackTrace(); } } private static void handleResponse(InputStream targetInput, OutputStream clientOutput) { try { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = targetInput.read(buffer)) != -1) { clientOutput.write(buffer, 0, bytesRead); clientOutput.flush(); } } catch (IOException e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yl-yue

辣条~香~请博主吃一包吧^_^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值