博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用httpclient和多线程刷訪问量代码
阅读量:6296 次
发布时间:2019-06-22

本文共 9664 字,大约阅读时间需要 32 分钟。

缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用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
map =new HashMap
(); 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
set=map.keySet(); Iterator
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{ //设置代理server地址和端口 client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key))); //这是用刷的是唱吧的訪问量,亲測有效,仅仅只是效率不是怎么高,由于代理server有快有慢,所以设置了超时机制。 //并且,貌似一个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方法,假设server须要通过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); //打印server返回的状态 //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
map =new HashMap
(); 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 block e1.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 block e1.printStackTrace(); } Set
set=map.keySet(); Iterator
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 { //设置代理server地址和端口 client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key))); //这是用刷的是唱吧的訪问量,亲測有效,仅仅只是效率不是怎么高,由于代理server有快有慢,所以设置了超时机制。 //并且,貌似一个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(); } } }}

你可能感兴趣的文章
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>