缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用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{
//设置代理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<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 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<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
{
//设置代理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(); }
}
}
}



利用httpclient和多线程刷訪问量代码的更多相关文章

  1. Cocos2d-x优化中多线程并发訪问

    多线程并发訪问在Cocos2d-x引擎中用的不是非常多,这主要是由于中整个结构设计没有採用多线程. 源自于Objective-C的Ref对象,须要使用AutoreleasePool进行内存管理,Aut ...

  2. Django訪问量和页面PV数统计

    http://blog.csdn.net/pipisorry/article/details/47396311 以下是在模板中做一个简单的页面PV数统计.model阅读量统计.用户訪问量统计的方法 简 ...

  3. Servlet 实现訪问量的统计小案例

    今天学习了Servlet的基础知识,学习了一个统计訪问量的小案例,记录一下 package cn.selevet_01; import java.io.IOException; import java ...

  4. HDU-1090-A+B for Input-Output Practice (II)(骗訪问量的)

    A+B for Input-Output Practice (II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327 ...

  5. 利用JS跨域做一个简单的页面訪问统计系统

    事实上在大部分互联网web产品中,我们一般会用百度统计或者谷歌统计分析系统,通过在程序中引入特定的JS脚本,然后便能够在这些统计系统中看到自己站点页面详细的訪问情况.可是有些时候,因为一些特殊情况,我 ...

  6. Nginx 訪问日志增长暴增出现尖刀的具体分析

    前言:          Nginx日志里面Mobileweb_access.log增长特别大.一天上百兆.将近100W的訪问记录.依照我们眼下的规模,热点用户才500个左右.就算人人用手机app訪问 ...

  7. Kivy A to Z -- 怎样从python代码中直接訪问Android的Service

    在Kivy中,通过pyjnius扩展能够间接调用Java代码,而pyjnius利用的是Java的反射机制.可是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了b ...

  8. Java中使用多线程、curl及代理IP模拟post提交和get訪问

    Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...

  9. 基于HttpClient 4.3的可訪问自签名HTTPS网站的新版工具类

    本文出处:http://blog.csdn.net/chaijunkun/article/details/40145685,转载请注明.因为本人不定期会整理相关博文,会对相应内容作出完好.因此强烈建议 ...

随机推荐

  1. java学习之坦克大战游戏

    总结:由于这几天快过年比较忙然后没怎么写,写代码途中一些经验总结现在给忘记了.这次的小项目感觉比上次写的思路清楚了点.没有之前第一次写那么逻辑混乱,结构也搞的比之前的要好,添加功能比较容易.学习了之前 ...

  2. 偶然碰到的Win7 64位下CHM 的问题解决

    最近下了几个沪江资料,都是chm格式的,但是在win7 64位下,都显示不了里面的音频和视频flash之类的控件,虽然可以通过源文件的方式打开视频文件,但是很麻烦.    网上似乎碰到的人也不是很多, ...

  3. sql日期转换格式

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...

  4. IOS中的自动布局

    Autolayout是一种“自动布局”技术,专门用来布局UI界面 Autolayout能很轻松地解决屏幕适配问题 Autolayout的两条核心概念:   >1 参照:通过参照其他控件或父控件来 ...

  5. CSS小技巧-图片自动缩放

    css的一个重要属性:max-width min-width 示例: <div width="500" height="259"><p> ...

  6. Nginx 之四: Nginx服务器的压缩功能和缓存功能

    在Nginx服务器配置文件中可以通过配置Gzip的使用,可以配置在http块,server 块或者location块中设置,Nginx服务器可以通过ngx_http_gzip_module模块.ngx ...

  7. hibernate 延长加载范围 4.2

    1. 关闭延迟加载功能 lazy="false"2.修改抓取策略 fetch="join"直接查询关联数据,一个联接查询搞定3.使用Hibernate对象的in ...

  8. android:background="@drawable/home_tab_bg"

    android:background="@drawable/home_tab_bg" home_tab_bg/xml: <bitmap xmlns:android=" ...

  9. Ubuntu实现双网卡双IP双待机

    Ubuntu实现双网卡双IP双待机 待机是借用了手机中的说法,其实是电脑上有两个网卡,一个无线,一个有线的.要实现无线访问外网Google Baidu查资料,有线网卡直接连接开发板.在Ubuntu上配 ...

  10. HDU 2227 Find the nondecreasing subsequences (线段树)

    Find the nondecreasing subsequences Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/3 ...