问题描述
我使用HttpURLConnection设置了一组代理ip222.165.130.82:80访问一个网站,然后立即换下一个代理ip200.117.239.246:8080重新访问这个站点,发现第二次的请求没有使用最新设置的代理设置,而是使用了第一次的222.165.130.82:80进行的通信,谁知道是为什么?我的猜测:怀疑HttpURLConnection内使用了缓存之类的东西——我在线程中sleep了20毫秒,发现新的设置生效了,等待时候很短的话(小于20毫秒的话),仍然使用了上一次的代理设置。设置的代码如下——if(auth.isProxy()){prop.setProperty("http.proxyHost",auth.getProxyIP());prop.setProperty("http.proxyPort",String.valueOf(auth.getProxyPort()));}else{prop.setProperty("http.proxyHost","");prop.setProperty("http.proxyPort","");}
2个线程代码——publicRunnabler1=newRunnable(){publicvoidrun(){Authenticationauth=newAuthentication();auth.setProxy(true);auth.setProxyIP("200.42.56.146");auth.setProxyPort(8080);Strings;try{s=GetWebContent("http://aa.com","gbk","GET",null,auth);System.out.println(s);}catch(Exceptione){e.printStackTrace();}}};publicRunnabler2=newRunnable(){publicvoidrun(){Authenticationauth=newAuthentication();auth.setProxy(false);auth.setProxyIP("200.117.239.246");auth.setProxyPort(8080);Strings;try{Thread.sleep(20);//每次改变代理ip后需要等待20ms左右才能生效s=GetWebContent("http://aa.com","gbk","GET",null,auth);System.out.println(s);}catch(Exceptione){e.printStackTrace();}}};newThread(r1).start();newThread(r2).start();
每次改变代理ip后需要等待20ms左右才能生效
解决方案
本帖最后由 makeppy 于 2011-11-20 19:47:35 编辑
解决方案二:
HELPME
解决方案三:
注意同步操作。
解决方案四:
引用2楼lw_china的回复:
注意同步操作。
设置代理的代码的作用域是全局的,GetWebContent是发起http请求的,该在哪里同步?——prop.setProperty("http.proxyHost","");prop.setProperty("http.proxyPort","");如何同步?
解决方案五:
什么东西是共用的,就同步什么。
解决方案六:
引用4楼lw_china的回复:
什么东西是共用的,就同步什么。
代理设置是公用,但是http的请求和代理设置如果同步的话,我的多线程就没有意义了呢?怎么办?
解决方案七:
必须用多线程吗?如果同步的结果==单线程的结果,为什么不直接用单线程处理呢?
解决方案八:
引用6楼nkliming的回复:
必须用多线程吗?如果同步的结果==单线程的结果,为什么不直接用单线程处理呢?
我的需要是同时检测N个代理ip的可用性,如果使用单线程的话,考虑到timeout等问题,时间太长了,等不起。。。。我大约有2000个ip。。。。
解决方案:
怎么搞到这么多代理IP呢
解决方案:
我在单线程运行下,也发现有延迟的问题,楼主解决了吗