缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用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. 代码收藏 JS实现页内查找定位功能

    前部分为IE下搜索方法 用TextRange来实现 后部分为firefox.chrome下搜索方法 var nextIndex = 0; var searchValue = ''; var input ...

  2. DOC下编译和运行带有包的java类文件

    前言: 带有包名的java类在DOC下编译可以成功,但是运行出错  错误: 找不到或无法加载主类 com.soanl.socket.MyServer D盘temp文件下有个Hello.java文件,包 ...

  3. 使用数据库绑定ListBox控件

    1. The HTML Markup <div> <asp:ListBox ID="ListBox1" runat="server">& ...

  4. IOS 指纹识别的简单使用

    首先导入LocalAuthentication框架 然后导入头文件 #import <LocalAuthentication/LAPublicDefines.h> - (void)begi ...

  5. linux kernel中timer的使用

    linux kernel中timer的使用 http://blog.csdn.net/njuitjf/article/details/16888821 在kernel中如果想周期性的干些什么事情,或者 ...

  6. Main function

    Main function A program shall contain a global function named main, which is the designated start of ...

  7. Definitions

    Definitions and ODR Definitions are declarations that fully define the entity introduced by the decl ...

  8. poj3693之后缀数组

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5946   Accepted: 1799 Description The r ...

  9. js方法中的this

    比如有个function: function ServiceMy(services) { //存放this,用于调试用 var tmp_this = this; this.services = []; ...

  10. Oracle 如何写出高效的 SQL

    转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽 ...