当前位置: 首页 > 知识库问答 >
问题:

每个线程使用自己的代理

司空鸿禧
2023-03-14

我正在尝试设置一个Java程序,其中每个线程都可以使用自己的代理。

现在我只找到了一种全局设置代理的方法。(http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html)

如前所述,这些设置会影响使用这些选项调用的VM的整个生命周期内的所有http连接。然而,使用该系统是可能的。setProperty()方法,使其具有更具动态性的行为。

下面是一段代码摘录,展示了如何做到这一点:

//将http代理设置为webcache。mydomain。通信:8080

System.set属性(“http.proxy主机”、“webcache.mydomain.com”);System.set属性(“http.proxy端口”、“8080”);

我尝试使用proxy类,但当我不想使用所述代理时,无法创建直接连接:

private void setProxy()
{
    if(proxyUrl != null)
    {
        SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
        proxy = new Proxy(Proxy.Type.HTTP, addr);
    }
    else
    {
        proxy = new Proxy(Proxy.Type.DIRECT, null);
    }       
}

…中的异常。。。。Java语言lang.IllegalArgumentException:type DIRECT与地址null不兼容

我怎样才能让它在直接连接中工作?尚未尝试代理。

共有2个答案

邓德本
2023-03-14

Barry NL的解决方案半途而废,因为我不知道如何不使用该解决方案的代理。

我想到的是:

proxyUrlproxyPort在我的类的构造函数中。

我无法调用url。openConnection(代理) 如果我刚刚设置代理=null

或者代理=新代理(proxy.Type.DIRECT,null) 。所以我写了我自己的openConnection

private void setProxy()
{
    if(proxyUrl != null)
    {
        SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
        proxy = new Proxy(Proxy.Type.HTTP, addr);
    }
    else
    {
        proxy = null;
    }       
}
private URLConnection openConnection2(URL url)
{
    try {
        if(proxy != null)               
            return url.openConnection(proxy);               
        else 
            return url.openConnection();            
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }   
}

setProxy()必须在建立任何连接之前调用。

另外我更换了

url = new URL(http_url);
con = (HttpURLConnection)url.openConnection(proxy);

url = new URL(http_url);
con = (HttpURLConnection)openConnection2(url);  

澹台冯浩
2023-03-14

可以使用代理类,如第3节所述:

正如我们所看到的,系统属性很强大,但不灵活。大多数开发人员认为“全有或全无”行为的限制过于严格。这就是为什么决定在J2SE 5.0中引入一个新的、更灵活的API,以便可以使用基于连接的代理设置。

你可以使用代理。没有代理到:

... 不使用任何代理。

做这样的事情:

private void setProxy()
{
    if(proxyUrl != null)
    {
        SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
        proxy = new Proxy(Proxy.Type.HTTP, addr);
    }
    else
    {
        proxy = Proxy.NO_PROXY;
    }       
}
 类似资料:
  • 我有多个带有注释的组件,我看到Spring一次只启动一个组件,即使它们被安排在同一时间运行。

  • 问题内容: 我正在编写一个多线程Java程序,其中每个线程可能都需要将其标准输出重定向到一个单独的文件。每个线程都有其自己的文件。是否可以在“每个线程”的基础上重定向System.out或在所有线程上全局更改System.out? 问题答案: 是否可以基于“每线程”重定向System.out 不,这是不可能的。 是静态的,并且在JVM最初启动时,每个JVM都会作为系统类加载器的一部分进行加载。尽管

  • 我有一个无界数据源(Kafka流)作为我的beam工作的输入。 数据的特性: 它们是元素组(组大小介于5-20个元素之间)。 每个组的键是唯一的标识符,并且仅用于该组。 组中第一个元素和最后一个元素之间的最大时间差小于2秒。 null 我的问题是:有没有一种方法可以让我在自己的窗口中分组每个键,并在一定时间后关闭它?非常感谢

  • 我试图理解这句话的含义: 每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法(§2.6)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 我假设JVM线程像任何其他线程一样工作——每次调度线程运行(比如Linux内

  • 我在试着理解这句话的意思: 每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何一点上,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法(§2.6)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 我假设JVM线程的工作方式与任何其他线程一样--每次调度线程运行时(比方

  • 我正在编写一个多线程Java程序,其中每个线程可能需要将其标准输出重定向到一个单独的文件。每个线程都有自己的文件。是否有可能在“每个线程”的基础上重定向System.out,还是所有线程对System.out全局更改?