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: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</a>
     * @改动人:
     * @改动时间:2014年8月18日 上午9:29:53
     * @返回值:void
     * @异常说明:
     */
    public void plusNum() {
        ShiMengRen.num++;
    }

    /**
     * @方法名:reductionNum
     * @描写叙述:总线程数的计数
     * @创建人:<a href=mailto: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</a>
     * @改动人:
     * @改动时间:2014年8月18日 上午9:30:22
     * @返回值:void
     * @异常说明:
     */
    public synchronized void plusThreadNum() {
        ShiMengRen.threadNum++;
    }

    /**
     * @方法名:reductionThreadNum
     * @描写叙述:并发线程数计数(事实上也不算是并发),使用同步标识符,防止多线程的干扰
     * @创建人:<a href=mailto: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</a>
     * @改动人:
     * @改动时间:2014年8月18日 上午9:30:33
     * @返回值:void
     * @异常说明:
     */
    public synchronized void plusView() {
        ShiMengRen.view++;
    }

    /**
     * @方法名:runShiMengRen
     * @描写叙述:调用sendPost的方法,以及各种计数
     * @创建人:<a href=mailto: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</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: [email protected]>小姨子的姐夫</a>
 * @改动人:
 * @改动时间:2014年8月1日 下午5:53:48
 * @改动说明:<br/>
 * @版本号信息:V1.0.0<br/>
 */
public class JennyThread {

    /**
     * @方法名:main
     * @描写叙述:小姨子的主方法
     * @创建人:<a href=mailto: [email protected]>小姨子的姐夫</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

时间: 2024-12-19 08:28:35

Java中使用多线程、curl及代理IP模拟post提交和get訪问的相关文章

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

Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! [java] view plaincopyprint? /** * @组件名:javaDemo * @包名:javaDemo * @文件名:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权所有. */ package javaDemo; impo

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

为什么Java中实现多线程的方式有两种?

在面试的过程中,我们经常问被面试者,为什么Java中实现多线程的方式有两种(一种是直接继承Thread类,一种是实现Runnable接口)?可惜的是,很多面试者都答不出来,甚至从来没有想为什么.,那么真正的原因是什么呢?我们可以用反证法推理一下: 假设Java只提供Thread供大家继承从而实现多线程,考虑下面的一个需求,如果有一个已经继承了某个父类的类,但是这个类又想实现多线程,怎么办?很显然,如果只提供一个可以继承的类,肯定解决不了这个问题.那么,如何解决,毫无疑问,就只能使用接口了.

Java中的 多线程编程

Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

黑马程序员【Java中的多线程】

Java中的多线程 首先,在开篇讲线程之前要说一个问题,我们知道多线程的执行原理是cpu在不同的线程中做着切换操作,而一提到多线程,大家首先想到的肯定是提高系统的运行效率,可是真的是这样的么?我们来借助一位大神博客中的代码就可以看出来有时单线程的运行效率要高于多线程: import threading from time import ctime class MyThread(threading.Thread): def __init__(self, func, args, name): thr

java中实现多线程的两种基本方法

java中实现多线程有两种基本方法,一种是继承Thread, 另一种是实现Runnable接口. 但是因为java中子类只能继承一个父类,如果采用继承Thread类,就不能继承其他类,很受限制. 以下是采用继承Thread类的例子: public class MyThreadTest{ public static void main(String[] args){ MyThread amythread1=new MyThread("my thread 1"); MyThread amy

java 中的多线程

java中实现多线程的方式有两种: 1.实现继承Thread 类的类(重写run方法) 2.实现Runnable 接口(重写run方法) 上述两种方式的关系; 看过jdk你会发现 Thread类是实现了 runnable的接口了的   可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势: (1). 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想. (2). 可以避免由于Java的单继承特性带

在java中获取URL的域名或IP与端口

在java中获取URL的域名或IP与端口 获取IP与域名方法一,使用正则表达式 public static String getIP(String url) { //使用正则表达式过滤, String re = "((http|ftp|https)://)(([a-zA-Z0-9._-]+)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(([a-zA-Z]{2,6})|(:[0-9]{1,4})?)"; String str = &quo