利用httpclient和多线程刷访问量代码

来源:互联网 发布:rgb色温调节算法 编辑:程序博客网 时间:2024/06/07 06:38

缘起于玩唱吧,因为唱吧好友少,访问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的访问机制,准备用java的httpclient库来进行刷访问量,想到动态IP重复使用就想到了用多线程来进行刷,但发现速度并没有增快,仍然是刷完一个网址刷下一个网址,这里刷的顺序是随机的。 主要让人伤脑筋的是那代理IP,去网上找了1000多个IP,有好多都是响应速度太慢了,以至于我设定了超时机制,超过一段时间的话就抛出异常并且忽略,只是速度太慢了,有待提高速度!!谁有好的改进的建议欢迎大家来分享,求大家指点。


注:下面的是第一次写的刷访问量代码的第一版,后来想想代码有问题,因为在实际测试中发现虽然用了线程,但是没有真正起到多线程的作用,效率没有得到提升,因为问题也算是学习的重要途径,所以我第一版代码就不改了,给大家作为借鉴。在再后面贴上改进版本的多线程刷访问量代码,这个代码经过测试后发现速度明显得到提升!结果真实有效!大笑


下面列出下面第一版代码的缺陷的原因:

主要就是因为一开始我对多线程编程中的start和run的方法的模糊认识导致的,首先来谈谈什么是两者的区别:

(1)start:

用start方法来启动线程,真正实现了多线程的运行,这是无需等待run方法代码执行完毕就可以直接继续执行下面的代码。通过调用Thread类的start方法来启动一个线程,这是此线程就处于就绪状态,并没有运行,一旦得到了cpu的时间片,就开始执行run方法,这里的run成为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程就终止。

(2)run:

run方法只是类的一个普通方法而已,如果直接调用run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法执行完毕后才可以继续执行小面的代码,这样就没有达到写线程的目的了。


因此,在第一个版本的代码中我的线程的启动方法是run,所以没有其他线程产生,所以没有达到多线程的目的。



web_look.java

import java.io.*;import java.util.*;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.cookie.CookiePolicy;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.http.params.CoreConnectionPNames;import org.apache.http.params.HttpConnectionParams;public class Web_look {public static void main(String[] args) throws IOException { int count=0; Map<String,String> map =new HashMap<String,String>();  FileReader reader=new FileReader("c://IP.txt");//读取代理IP地址 BufferedReader br=new BufferedReader(reader); String str=null; while((str=br.readLine())!=null)//格式写成IP+端口 { String result[]=str.split("@"); String info[]=result[0].split(":"); map.put(info[0], info[1]); } Set<String> set=map.keySet(); Iterator<String> iter=set.iterator();       HttpClient client = new HttpClient();        //设置超时时间     client.setTimeout(10000);     client.setConnectionTimeout(10000);     //设置cookie管理策略     client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);          while(iter.hasNext())//不断的取出IP和端口     {    String key=iter.next();System.out.println(key+":"+map.get(key));    //用try-catch来忽略超时异常继续执行try{//设置代理服务器地址和端口    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。    MyThread song1= new MyThread("http://changba.com/s/TKSPrlyJgkd4cUir8pGZkQ?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);    MyThread song2= new MyThread("http://changba.com/s/48SlsCcpHNiNXPji_VyU5Q?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);//    MyThread song3= new MyThread("http://changba.com/s/0GP_YQzqRJOJUHjDbRpPBg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);//    MyThread song4= new MyThread("http://changba.com/s/XXCW9aOqzkiQW1ha1hSMvg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);//    MyThread song5= new MyThread("http://changba.com/s/7HpyApA4gWXoh-V0usAMfw?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);//    MyThread song6= new MyThread("http://changba.com/s/8y6IvXu-8uwUrrT7uEtHEA?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);//    MyThread song7= new MyThread("http://changba.com/s/lyBc498kdr9N4DgR5lqFCg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);            song1.run();    song2.run();//    song3.run();//    song4.run();//    song5.run();//    song6.run();//    song7.run();            //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https//使用POST方法     //HttpMethod method = new PostMethod("http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk");     //设置请求头,来模拟浏览器登陆,有些网站需要,有些网站不需要,看具体是什么网站了//      method.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;"); //    method.setRequestHeader("Accept-Language", "zh-cn"); //    method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"); //    method.setRequestHeader("Accept-Charset","encoding"); //    method.setRequestHeader("Keep-Alive", "300"); //    method.setRequestHeader("Connection", "Keep-Alive"); //    method.setRequestHeader("Cache-Control", "no-cache");         //client.executeMethod(method);    //打印服务器返回的状态    //System.out.println(method.getStatusLine());    //打印返回的信息    //System.out.println(method.getResponseBodyAsString());    //释放连接,否则会报错recycle    //method.releaseConnection();}catch(Exception e){e.printStackTrace();}count++;System.out.println("第"+count+"个IP地址");     }   }}

Mythread.java

import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.methods.PostMethod;public class MyThread extends Thread{private String web_name;private HttpClient client;public MyThread(String web_name,HttpClient client){this.web_name=web_name;this.client=client;}public void run(){HttpMethod method = new PostMethod(web_name);try{client.executeMethod(method);System.out.println(method.getStatusLine());System.out.println(method.getResponseBodyAsString());method.releaseConnection();}catch(Exception e){e.printStackTrace();}}}

这里的多线程没有起到预期的效果,因为貌似唱吧里面对同一个IP访问多个歌曲只算访问的第一首,所以哪怕写了再多线程也只算访问了第一首,第一首歌访问量加了1,其他的仍然不变。所以,如果有其他页面的话可以附带将其他页面加入多线程来刷。

———————————————————————————————————————————————————分割线———————————————————————————————————————————————————


下面我就贴上我的改进版,这个版本真正实现了多线程访问,并且更加具有灵活性,可以多个线程刷相同或者不同的网页,而且可以选择不同的IP地址文件。

web_look.java

import java.io.*;import java.util.*;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.cookie.CookiePolicy;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.http.params.CoreConnectionPNames;import org.apache.http.params.HttpConnectionParams;public class Web_look {public static void main(String[] args) throws IOException {String web_name=null;web_name="http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk";    //用try-catch来忽略超时异常继续执行try{Thread threads[]=new Thread[5];    threads[0]= new Thread(new MyThread(web_name,"c://IP.txt"));    threads[1]= new Thread(new MyThread(web_name,"c://IP1.txt"));    threads[2]= new Thread(new MyThread(web_name,"c://IP2.txt"));    threads[3]= new Thread(new MyThread(web_name,"c://IP3.txt"));    threads[4]= new Thread(new MyThread(web_name,"c://IP4.txt"));       for(int i=0;i<5;i++)    {    threads[i].start();    }}catch(Exception e){e.printStackTrace();}     }}


MyThread.java

import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.cookie.CookiePolicy;import org.apache.commons.httpclient.methods.PostMethod;public class MyThread implements Runnable{private String web_name;private String IP_file;private HttpClient client = new HttpClient();  private String str=null;private FileReader reader;private BufferedReader br;private Map<String,String> map =new HashMap<String,String>();public MyThread(String web_name,String IP_file){this.web_name=web_name;this.IP_file=IP_file;}public void run(){try {reader=new FileReader(IP_file);br=new BufferedReader(reader);} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//读取代理IP地址try {while((str=br.readLine())!=null)//格式写成IP+端口 { String result[]=str.split("@"); String info[]=result[0].split(":"); map.put(info[0], info[1]); }} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} Set<String> set=map.keySet(); Iterator<String> iter=set.iterator();        //设置超时时间    client.setTimeout(10000);    client.setConnectionTimeout(10000);    //设置cookie管理策略    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);        while(iter.hasNext())//不断的取出IP和端口     {    String key=iter.next();System.out.println(key+":"+map.get(key));try{//设置代理服务器地址和端口    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。    }catch(Exception e){e.printStackTrace();}HttpMethod method = new PostMethod(web_name);try{System.out.println(IP_file);client.executeMethod(method);//System.out.println(method.getStatusLine());//System.out.println(method.getResponseBodyAsString());method.releaseConnection();}catch(Exception e){e.printStackTrace();}     }}}




0 0