Java中使用多线程、curl及代理IP模拟post提交和get訪问
Java中使用多线程、curl及代理IP模拟post提交和get訪问
菜鸟,多线程好玩就写着玩。大神能够路过不吝赐教。小弟在这受教。谢谢!
很多其它分享请关注微信公众号:lvxing1788
~~~~~~
切割线扭起来 ~~~~~~
/**
* @组件名:javaDemo
* @包名:javaDemo
* @文件名称:Jenny.java
* @创建时间: 2014年8月1日 下午5:53:48
* @版权信息:Copyright © 2014 eelly Co.Ltd,小姨子版权全部。
*/ package javaDemo; import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Random; /**
* 用于异常的抛出而定义,由于Exception不能抛出。仅仅有子类才干
*/
class MyException extends Exception { private static final long serialVersionUID = -1485825968429580934L; public MyException() {
super();
} public MyException(String msg) {
super(msg);
} public MyException(String msg, Throwable cause) {
super(msg, cause);
} public MyException(Throwable cause) {
super(cause);
}
} /**
* 一个小姨子须要的线程类
*/
class ShiMengRen implements Runnable { /**
* 浏览量的链接
*/
private String url = "http://www.*******.com/article/yj/views.jhtml"; /**
* 点赞的链接
*/
private String urlZan = "http://www.********.com/article/yj/ups.jhtml"; /**
* 游记的ID
*/
private String param = "article_id=10844"; /**
* 多线程共享的全局变量
*/
// private volatile boolean flag = true; /**
* 同一时候进入post提交的线程数
*/
private static final int MAX_THREAD_COUNT = 25; /**
* 同一时候进入post提交的线程数的计数器
*/
private volatile static int threadNum = 0; /**
* 计数
*/
private static int num = 0; /**
* 浏览次数
*/
private static int view = 0; /**
* 代理IP
*/
private String[] proxyArray = { "127.0.0.1:8787", "115.239.210.199:80", "149.255.255.242:80",
"124.172.242.175:80", "117.59.217.243:80", "183.234.59.89:18186", "117.59.217.236:80",
"183.224.1.56:80", "120.202.249.230:80", "125.46.100.198:9999", "112.65.19.122:8080",
"202.96.172.234:808", "183.224.1.114:80", "183.224.1.113:80", "222.66.115.229:80" }; // public void setFlag(boolean flag) {
// this.flag = flag;
// }
//
// public boolean getFlag() {
// return this.flag;
// }
//
// public void stop() {
// this.setFlag(false);
// }
//
// public void start() {
// this.setFlag(true);
// } public void setNum(int num) {
ShiMengRen.num = num;
} public int getNum() {
return ShiMengRen.num;
} public void setThreadNum(int threadNum) {
ShiMengRen.threadNum = threadNum;
} public int getThreadNum() {
return ShiMengRen.threadNum;
} public int getView() {
return ShiMengRen.view;
} /**
* @方法名:getProxy
* @描写叙述:随机获代替理IP
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:23:36
* @return
* @返回值:String[]
* @异常说明:
*/
public String[] getProxy() {
String[] strlist = null;
int len = proxyArray.length - 1;
int num = 0;
if (0 < len) {
num = new Random().nextInt(len);
}
String proxy = this.proxyArray[num];
if (proxy != "") {
strlist = proxy.split(":");
} return strlist;
} /**
* @方法名:sendGet
* @描写叙述:向指定URL发送GET方法的请求
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:26:27
* @param url
* 发送请求的URL
* @param param
* 请求參数,请求參数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
* @返回值:String
* @异常说明:
*/
public String sendGet(String url, String param) {
String result = "";
BufferedReader in = null; String[] proxyList = this.getProxy();
if (null != proxyList) {
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", proxyList[0]);
System.setProperty("http.proxyPort", proxyList[1]);
}
try {
String urlNameString = url + "? " + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取全部响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历全部的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
} return result;
} /**
* @方法名:sendPost
* @描写叙述:向指定 URL 发送POST方法的请求
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:29:09
* @param url
* 发送请求的 URL
* @param param
* 请求參数。请求參数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果
* @throws Exception
* @返回值:String
* @异常说明:
*/
public String sendPost(String url, String param) throws Exception {
PrintWriter out = null;
BufferedReader in = null;
String result = ""; String[] proxyList = this.getProxy();
if (null != proxyList) {
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", proxyList[0]);
System.setProperty("http.proxyPort", proxyList[1]);
}
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置例如以下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象相应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求參数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
throw new MyException("发送 POST 请求出现异常!" + e);
// System.out.println("发送 POST 请求出现异常!" + e);
// e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
throw new MyException("发送 POST 请求出现异常! " + ex);
// ex.printStackTrace();
}
} return result;
} /**
* @方法名:plusNum
* @描写叙述:总线程数的计数
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:29:53
* @返回值:void
* @异常说明:
*/
public void plusNum() {
ShiMengRen.num++;
} /**
* @方法名:reductionNum
* @描写叙述:总线程数的计数
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:03
* @返回值:void
* @异常说明:
*/
public void reductionNum() {
ShiMengRen.num--;
ShiMengRen.num = ShiMengRen.num < 0 ? 0 : ShiMengRen.num;
} /**
* @方法名:plusThreadNum
* @描写叙述:并发线程数计数(事实上也不算是并发),使用同步标识符,防止多线程的干扰
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:22
* @返回值:void
* @异常说明:
*/
public synchronized void plusThreadNum() {
ShiMengRen.threadNum++;
} /**
* @方法名:reductionThreadNum
* @描写叙述:并发线程数计数(事实上也不算是并发),使用同步标识符,防止多线程的干扰
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:28
* @返回值:void
* @异常说明:
*/
public synchronized void reductionThreadNum() {
ShiMengRen.threadNum--;
ShiMengRen.threadNum = ShiMengRen.threadNum < 0 ? 0 : ShiMengRen.threadNum;
} /**
* @方法名:plusView
* @描写叙述:浏览量计数。使用同步标识符。防止多线程的干扰
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:33
* @返回值:void
* @异常说明:
*/
public synchronized void plusView() {
ShiMengRen.view++;
} /**
* @方法名:runShiMengRen
* @描写叙述:调用sendPost的方法,以及各种计数
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:37
* @throws MyException
* @throws InterruptedException
* @返回值:void
* @异常说明:
*/
public void runShiMengRen() throws MyException, InterruptedException {
this.plusNum();
try {
Thread.sleep(new Random().nextInt(2000));
if (ShiMengRen.MAX_THREAD_COUNT > this.getThreadNum()) {
this.plusThreadNum(); // 计数器自增
String result = sendPost(this.url, this.param); // 刷浏览数
sendPost(this.urlZan, this.param); // 刷点赞数
if (result.equals("1")) {
this.plusView();
this.jennyLog("浏览次数:" + this.getView() + "\n");
}
}
} catch (Exception e) {
Thread.sleep(2000);
throw new MyException("站点出现异常,停止全部线程.");
} finally {
System.out.println("等待运行线程队列:" + this.getNum() + "。当前异步线程数量:" + this.getThreadNum()
+ ",浏览次数:" + this.getView());
this.reductionNum();
this.reductionThreadNum();
}
} /**
* @方法名:jennyLog
* @描写叙述:小姨子的日志记录,仅仅为看浏览量的变化
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月18日 上午9:30:52
* @param data
* @throws IOException
* @返回值:void
* @异常说明:
*/
public void jennyLog(String data) throws IOException {
File file = new File("/home/beyond/tmp/Jenny.log.txt");
// File file = new File("E:\\Jenny.log.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Writer out = new FileWriter(file);
out.write(data);
out.close();
} /**
* <p>
* 主题:run
* </p>
* <p>
* 描写叙述:往死里拼命的Post提交数据
* </p>
*
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
for (;;) {
try {
this.runShiMengRen();
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常.");
}
}
}
} /**
* @类名:Jenny
* @描写叙述:小姨子类
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月1日 下午5:53:48
* @改动说明:<br/>
* @版本号信息:V1.0.0<br/>
*/
public class JennyThread { /**
* @方法名:main
* @描写叙述:小姨子的主方法
* @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
* @改动人:
* @改动时间:2014年8月1日 下午5:53:48
* @param args
* @throws Exception
* @返回值:void
* @异常说明:
*/
public static void main(String[] args) {
Runnable t = new ShiMengRen();
for (int i = 0; i < 60; i++) {
new Thread(t, "Thread-" + i).start();
}
}
}
~~~~~~ 切割线扭起来 ~~~~~~
很多其它分享请关注微信公众号:lvxing1788
Java中使用多线程、curl及代理IP模拟post提交和get訪问的更多相关文章
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- 【转】Java中的多线程学习大总结
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- java中的多线程 // 基础
java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
随机推荐
- SwiftUI 官方教程(一)
完整中文教程及代码请查看 https://github.com/WillieWangWei/SwiftUI-Tutorials 创建和组合 View 此部分将指引你构建一个发现和分享您喜爱地方的 ...
- Mysql外键的变种 三种关系
一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以 ...
- 基于scrapy-redis组件的分布式爬虫
scrapy-redis组件安装 分布式实现流程 scrapy-redis组件安装 - 下载scrapy-redis组件:pip install scrapy-redis - 更改redis配置文件: ...
- C#解除某类警告。。。。。。。。。。
C#预处理器指令取消不必要的警告 今天将自己写的一个类库生成一个DLL后,想把注释也加进去.... 方法:在属性->生成选项卡->XML文档文件(勾选)(生成的文件名不能修改,使用时必须跟 ...
- 第5章分布式系统模式 在 .NET 中使用 DataSet 实现 Data Transfer Object
要在 .NET Framework 中实现分布式应用程序.客户端应用程序需要显示一个窗体,该窗体要求对 ASP.NET Web Service 进行多个调用以满足单个用户请求.基于性能方面的考虑,我们 ...
- css3动画简单案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 微信小程序开发之animation动画实现
1. 创建动画实例 wx.createAnimation(OBJECT) 创建一个动画实例animation.调用实例的方法来描述动画.最后通过动画实例的export方法导出动画数据传递给组件的ani ...
- linux抓包命令-tcpdump命令详解
最近调试支付接口的时候,遇到了一个奇怪的问题:我按照支付接口文档,对接支付通道,当消费业务正常后,调试查余和冲正的时候,支付通道的对接技术告诉我,系统没有我们支付系统的请求报文,数据库和日志中都没有, ...
- PostgreSQL 保留关键字添加方法之一,不带参数的函数
以添加sysdate关键字为例说明: 1.src\backend\parser\gram.y文件的%token <keyword>段添加SYSDATE关键字,建议按照ASCII顺序添加 2 ...
- 基于ACE的TAO开发---一个简单的入门实例-----VS2008(一)
万事开头难,不管做什么事最开始总是最困难的,一旦上手了就好了. 这也是我自己学习corba编程的一点经验和心得.下面的例子主要是保证读者跟着走能立马看到效果. 1.机器上的TAO是实现已经装好的开发版 ...