java代理相关知识

文章目录

  • 1. 简介
  • 2. 系统属性
  • 3. Proxy类
  • 4. ProxySelector类

1. 简介

许多系统通过代理服务器访问Web,有时还会访问Internet的其他非HTTP部分。代理服务器接受从本地客户端服务器的请求。代理服务器向远程服务器发出请求,再将结果转发回本地客户端。有时这样做是为了安全,如防止远程主机了解关于本地网络配置的秘密细节。另外一些情况,这样做是为了通过过滤出站请求,限制可以浏览的网站。而还有一些情况则纯粹是出于性能的考虑,这样允许多个用户从本地缓存中获取同样的一些经常访问的文档,二不是重复从远程主机下载。基于URL类的java程序可以使用大多数常见的代理服务器和协议。事实上,正是出于这个原因,你要选择使用URL类,而不是在原始socket之上处理你自己的HTTP或其他客户端。

2. 系统属性

如果要指定纯粹的HTTP代理,则将http.proxyHost设置为代理服务器的域名或IP地址,将http.proxyPort设置为代理服务器的端口(默认为80)。还有一些其它方法,包括在Java代码中调用System.setProperty(),或在启动项中设置-D选项。

public class QuizCardBuilder {
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.setProperty("http:proxyHost","192.168.254.254");
        System.setProperty("http.proxyPort","9000");
        System.setProperty("http.nonProxyHosts","java.oreilly.com|xml.orelly.com")
    }
}

如果希望一台主机不被代理,而是要直接连接目标服务器,则要把http.nonProxyHosts系统属性设置为其主机名或IP地址。如果多个主机不需要代理,可以用竖线隔开这些主机名。“*”表示某个特定的所有主机都不需要代理。

如果要对ftp设置,一样的操作即可

Java不支持任何其他应用层协议,但是如果对所有的TCP连接都使用传输层SOCKS代理,可以用socksProxyHost和socksProxyPort系统属性来确定。Java对SOCKS没有提供禁止代理选项,这是一个全有或全无的选择。

3. Proxy类

在Java中,java.net.Proxy类用于表示代理服务器。代理服务器充当客户端和目标服务器之间的中间人,它接收来自客户端的请求,并将其转发给目标服务器,然后将响应返回给客户端。Proxy类提供了一种封装代理服务器的方式,以便在网络通信中使用代理。Proxy类允许从Java程序中对代理服务器进行更细粒度的控制。确切的说,它允许你为不同的远程主机选择不同的代理服务器,它有三种代理模式,分别用Proxy.Type枚举中的三个常量表示:

  • Proxy.Type.DIRECT
  • Proxy.Type.HTTP
  • Proxy.Type.SOCKS
    除了类型之外,关于代理的其它重要信息包括它的地址和端口,用SocketAddress对象表示。
public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            // 创建代理服务器地址
            InetSocketAddress proxyAddress = new InetSocketAddress("proxy.example.com", 8080);

            // 创建代理实例
            Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);

            // 创建目标URL
            URL url = new URL("http://www.example.com");

            // 打开连接并设置代理
            HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);

            // 发送请求并读取响应
            connection.setRequestMethod("GET");
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            // 关闭连接
            connection.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. ProxySelector类

java.net.ProxySelector是Java中的一个类,用于选择适当的代理服务器。在Java中,可以使用ProxySelector类来设置和获取代理选择器,并使用它来选择与特定URL或协议相关联的代理服务器。ProxySelector类提供了以下主要方法:

  • getDefault():静态方法,返回默认的代理选择器。默认情况下,它使用系统属性来确定代理设置。

  • setDefault(ProxySelector ps):静态方法,设置默认的代理选择器。

  • select(URI uri):选择与指定URI相关联的代理服务器。根据传递的URI,select()方法返回一个包含Proxy对象的List,其中每个Proxy对象表示一个可用的代理服务器。

  • connectFailed(URI uri, SocketAddress sa, IOException ioe):通知代理选择器连接失败的情况。这个方法允许代理选择器调整代理的偏好顺序。

import java.io.IOException;
import java.net.*;

public class ProxySelectorTest {
    public static void main(String[] args) {
        try {
            // 创建URL
            URL url = new URL("http://www.example.com");

            // 自定义代理选择器
            ProxySelector proxySelector = new ProxySelector() {
                @Override
                public List<Proxy> select(URI uri) {
                    // 返回一个包含单个HTTP代理的列表
                    List<Proxy> proxies = new ArrayList<>();
                    proxies.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.example.com", 8080)));
                    return proxies;
                }

                @Override
                public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
                    // 处理连接失败的情况
                    System.out.println("Failed to connect to proxy: " + sa);
                }
            };

            // 设置自定义的代理选择器
            ProxySelector.setDefault(proxySelector);

            // 选择代理服务器
            URI uri = url.toURI();
            List<Proxy> proxies = proxySelector.select(uri);

            // 输出可用的代理服务器
            for (Proxy proxy : proxies) {
                System.out.println("Proxy: " + proxy);
                SocketAddress address = proxy.address();
                if (address instanceof InetSocketAddress) {
                    InetSocketAddress proxyAddress = (InetSocketAddress) address;
                    System.out.println("Proxy Hostname: " + proxyAddress.getHostName());
                    System.out.println("Proxy Port: " + proxyAddress.getPort());
                }
            }
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们创建了一个ProxySelector匿名内部类,重写了select()方法和connectFailed()方法,以提供自定义的代理选择逻辑。在select()方法中,我们返回一个包含单个HTTP代理的列表,代理服务器的地址是proxy.example.com,端口号是8080。在connectFailed()方法中,我们处理连接失败的情况。然后,我们使用ProxySelector.setDefault()方法设置自定义的代理选择器。接下来,我们将URL转换为URI,并使用select()方法选择与URI相关联的代理服务器。最后,我们遍历返回的代理服务器列表,并输出每个代理服务器的相关信息。请注意,上述代码中的代理服务器地址和端口号是示例,需要根据实际情况进行修改,以便进行测试。这个示例代码用于演示如何自定义代理选择器,并使用ProxySelector类选择代理服务器。根据实际需求,可以根据特定的逻辑和条件编写自定义的代理选择器,以满足具体的代理需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/24112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day17 - 用形状包围图像

在进行图像轮廓提取时&#xff0c;有的情况下不需要我们提取出精确的轮廓&#xff0c;只要提取出一个接近于轮廓的近似多边形&#xff0c;就可以满足后续的操作。 本期我们来学习如何通过设置参数来找出图像的近似多边形。 完成本期内容&#xff0c;你可以&#xff1a; 了解…

算法基础学习笔记——⑨C++STL使用技巧

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨CSTL简介 ✨CSTL使用技巧 前言&#xff1a;算法学习笔记记录日常分享&#xff0c;需要的看哈O(∩_∩)O&#xff0c;感谢大家的支持&#xff01; ✨CSTL简介 vector变长数组&#xff0c;倍增的思想//系统为…

STM32单片机(三)第一节:GPIO输出

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

驱动开发:内核读写内存浮点数

如前所述&#xff0c;在前几章内容中笔者简单介绍了内存读写的基本实现方式&#xff0c;这其中包括了CR3切换读写&#xff0c;MDL映射读写&#xff0c;内存拷贝读写&#xff0c;本章将在如前所述的读写函数进一步封装&#xff0c;并以此来实现驱动读写内存浮点数的目的。内存浮…

MyBatis操作数据库表和动态SQL的使用

目录 1.MyBatis开发环境的搭建和测试 2.MyBatis基本操作 2.0 准备工作 2.1 新增操作 2.2 删除、修改、查询操作 2.3 #{param} 和 ${param}的使用和区别 2.4 实体对象属性和数据库字段名称不同时如何映射&#xff1f; 3. MyBatis多表查询 3.0 准备工作 3.1 一对一的表…

ELK企业级日志分析系统

ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。 往…

切比雪夫不等式,大数定律及极限定理。

一.切比雪夫不等式 1.定理 若随机变量X的期望EX和方差DX存在,则对任意ε > 0,有   P{ |X - EX| > ε } < DX/ε2 或 P{ |X - EX| < ε } > 1 - DX/ε2 2.解析定理 ①该定理对 X 服从什么分布不做要求&#xff0c;仅EX DX存在即可。 ②“| |” 由于X某次…

软件测试炸了,作为从业者,你做好准备了吗?

软件测试行业已经发生很大变化&#xff0c;你跟上变化了吗&#xff1f; 岗位少不可怕&#xff0c;要求越来越高也不可怕&#xff0c;可怕的是&#xff0c;软件测试行业已经发生巨变&#xff0c;而你却原地踏步&#xff01;目前一线大厂更多倾向于招收测试开发&#xff0c;或者…

自学网络安全(黑客),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且…

torch.distributed.launch多卡多机

torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.distributed.launch 可以通过命令&#xff0c;来打印该模块提供的可选参数 python -m torch.distributed.launch --help usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]…

诚迈科技携智达诚远出席高通汽车技术与合作峰会

5月25日至26日&#xff0c;诚迈科技及旗下的智能汽车操作系统及中间件产品提供商智达诚远作为高通生态伙伴&#xff0c;亮相首届“高通汽车技术与合作峰会”&#xff0c;通过产品展示和主题演讲呈现了基于高通骁龙数字底盘的最新智能座舱技术成果&#xff0c;共同展望智能网联汽…

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…

Revit幕墙:用幕墙巧做屋面瓦及如何快速幕墙?

一、Revit中用幕墙巧做屋面瓦 屋面瓦重复性很高&#xff0c;我们如何快速的创建呢?下面我们来学会快速用幕墙来创建屋面瓦的技巧。 1.新建“公制轮廓-竖挺”族&#xff0c;以此来创建瓦的族(以便于载入项目中使用) 2.在轮廓族中绘制瓦的轮廓(轮廓需要闭合)&#xff0c;将族名称…

【JavaSE】Java基础语法(三十四):实现多线程

文章目录 1. 简单了解多线程2. 并发和并行3. 进程和线程4. 实现多线程方式一&#xff1a;继承Thread类【应用】5. 实现多线程方式二&#xff1a;实现Runnable接口【应用】6. 实现多线程方式三: 实现Callable接口【应用】7. 设置和获取线程名称【应用】8. 线程休眠【应用】9. 线…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

xlsx是什么格式

xlsx是什么格式? xlsx是Excel文档的扩展名&#xff0c;其基于Office Open XML标准的压缩文件格式&#xff0c;取代了其以前专有的默认文件格式&#xff0c;在传统的文件名扩展名后面添加了字母x&#xff0c;即.xlsx取代.xls。 xlsx文件是什么格式? xlsx是Excel表格的文件格…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明二、准备工作三、测试计划设计 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明 可以对一个组变量进行循环迭代&#xff1b;该组件通常与后置处理器中的 JSON 提取器、正…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色&#xff0c;是城市生命线的重要组成部分。然而&#xff0c;随着时间的推移和日益增长的负荷&#xff0c;桥梁可能会受到各种因素的损害&#xff0c;如自然灾害、疲劳、腐蚀等。因此&#xff0c;桥梁结构健康监测变得至关重要&…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…
最新文章