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();
- }
- }
- }
~~~~~~ 分割线扭起来 ~~~~~~
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 ...
随机推荐
- CSS图片下面产生间隙的6种解决方案
CSS图片下面产生间隙的6种解决方案 在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是 ...
- 转:我是否该放弃VB.Net?
我是否该放弃VB.Net呢?这个问题一次次的出现在我的脑海里,而且这种想法越来越强烈.放弃VB.Net至少能让我的生活变得轻松些.如果你是个C#程序员,那拷贝粘贴代码会很容易,因为可以找到的例子代码如 ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- PHP复制文件夹及文件夹内的文件
//1.取被复制的文件夹的名字://2.写出新的文件夹的名字://3.调用此函数,将旧.新文件夹名字作为参数传递://4.如需复制文件夹内的文件,第三个参数传1,否则传0: public functi ...
- Fiddler抓取HTTPS最全(强)攻略
本文来自于柠檬班49期学员superman童鞋的学习笔记.希望对同样是测试萌新的你有帮助,如果觉得好,可以点个赞噢~ 对于想抓取HTTPS的测试初学者来说,常用的工具就是fiddler.可是在初学时, ...
- IE 11 使用 flexbox 垂直居中 bug
不要使用 min-height 改为 height 即可 caniuse: https://caniuse.com/#search=flexbox
- Javascript - LayUI库的流加载
LayUI库的流加载 用的LayUI-v2.2.45,将整个包解压缩后添加到项目,引入两个文件即可,不需要引入Jquery,此库自带: <link href="../js/layui- ...
- 一个简单的Java程序
一个.NET技术还是很菜的水平的猿人现在要去学习Java不知道是坏是好,无从得知啊! 不过在网上看了好多Java方面的简单例子,感觉Java还是蛮不错的么!不管以后怎么样啦,先开始自己的Java菜鸟之 ...
- javaweb笔记七
过滤器:是一个web中间组件,用于拦截从客户端发送给服务器的请求和响应.当客户端向服务器发出请求时,服务器会查看是否有过滤器和该请求匹配,如果有,则交给过滤器执行,业务操作后,可以将请求继续向目标资源 ...
- Java编程的逻辑 (58) - 文本文件和字符流
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...