`

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

    博客分类:
  • Java
阅读更多

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.shimengren.com/article/yj/views.jhtml";  
  
    /** 
     * 点赞的链接 
     */  
    private String urlZan = "http://www.shimengren.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

分享到:
评论

相关推荐

    通过HTTP多线程并发post/get数据

    本文将深入探讨如何使用C++通过HTTP协议实现多线程并发地发送POST和GET请求,以及如何将返回的数据展示到用户界面。我们将围绕“通过HTTP多线程并发post/get数据”这一主题,结合使用VC++6.0作为编译环境来阐述相关...

    php的curl多线程采集.zip

    因此,在实际应用中,需要适当控制并发数量,考虑使用代理IP池,以及合理地释放和重用cURL句柄以优化性能。 在标签"类库下载-php的curl多线程采集"中,我们可以理解为可能包含了实现这一功能的相关类库或脚本。在...

    java(简易)多线程HTTP服务器

    在Java编程领域,构建一个简易的多线程HTTP服务器是一项常见的练习,这有助于理解网络通信、线程管理和HTTP协议的基本原理。在这个项目中,我们利用Java的线程池和Socket库来实现这样一个服务器,它支持GET、POST...

    IDENTITY完成用户注册认证,PHPCURL多线程GETPOST类.pdf

    在PHP中,可以使用cURL进行多线程GET或POST请求,提高数据处理的效率。 3. OWIN+AspNet.Identity: OWIN是一种用于.NET应用的中间件接口,它允许.NET应用程序与Web服务器进行解耦,更容易地编写独立于具体服务器的...

    php的curl多线程采集

    3. **非阻塞模式**:在多线程环境中,可以将`curl_multi_exec()`放入一个循环,使用`curl_multi_select()`或`stream_select()`函数来判断是否有可读写事件发生,这样可以避免程序在等待I/O时浪费CPU资源。...

    Qt工程中使用curl进行网络请求,最小程序

    - 记得在每个线程中独立初始化和清理curl,以避免线程安全问题。 - 如果使用动态库,确保在所有需要curl的进程中都能访问到.dll文件。 通过这个简单的Qt工程,你已经掌握了如何在Qt中使用curl进行网络请求的基础...

    网络发包工具 POST/GET

    在这个场景中,我们关注的工具支持两种主要的HTTP请求方法:POST和GET。 **POST方法**是HTTP请求中最常见的一种,用于向服务器提交数据。当你在网页上填写表单并点击“提交”按钮时,通常就是使用的POST方法。它将...

    浅谈php使用curl模拟多线程发送请求

    PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...

    lua-cURL访问http/https

    Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua脚本能够方便地与Web服务进行交互,比如发送GET、POST请求,处理cookies,上传文件,...

    CUrlHttp封装curl类

    CUrlHttp封装curl类是一个基于curl库的PHP类,它为开发者提供了更加便捷的方式来执行HTTP请求,如GET、POST以及表单提交等操作。curl库是一个强大的URL传输库,广泛应用于各种网络请求任务,包括文件上传下载、网页...

    QT C++ http get、post 同步异步请求

    本项目中,我们关注的是GET和POST两种请求方式,以及它们的同步和异步实现。下面将详细介绍这两种请求方式以及同步与异步的区别。 1. **QT中的HTTP GET请求** GET请求是最常见的HTTP请求类型,用于从服务器获取资源...

    crul多线程查询百度收录情况

    在PHP中,cURL库允许开发者创建HTTP请求,模拟浏览器行为,包括提交表单、处理cookies和执行POST请求等。在本项目中,cURL将用于发送HTTP GET请求到百度的搜索接口,以检查特定URL是否被百度收录。 要实现多线程...

    curl使用方法及命令的介绍

    - `CURL使用指南.doc`、`CURL详解.doc`、`curl 也玩多线程.doc`、`curl应用总结.doc`、`cURL使用心得.doc`:这些文档提供了更详细的`curl`使用教程和实践经验。 - `curl.pdf`:可能是官方或第三方编写的`curl`用户...

    http.zip_c++ post_http get_http post get_post http

    - 考虑使用异步I/O或多线程技术提高并发处理能力。 - 缓存机制可以减少不必要的网络请求,提高响应速度。 - 优化内存管理,避免内存泄漏。 总之,通过C++实现HTTP协议的GET和POST方法,不仅需要理解HTTP协议的...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    在Java编程中,多线程和线程安全是核心概念,尤其在开发高效、响应迅速的应用时更是不可或缺。本实践项目以HTTP协议为基础,探讨如何实现断点续传功能,这是在网络上传输大文件时非常实用的一个特性。下面将详细阐述...

    android jni使用curl进行http请求和文件下载

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他编程语言(如C++)进行交互。JNI在很多场景下都很有用,比如优化性能、调用系统底层库或者像本例中那样,利用C/C++库来实现特定功能。...

    C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

    开发过程中,还需要考虑性能优化,例如使用多线程或多进程模型来处理并发请求,或者使用epoll()进行高效I/O事件管理。此外,错误处理和日志记录也是必不可少的部分,以确保服务器的稳定运行。 为了调试和测试,...

    php多线程批量采集下载图片的实现代码函数类

    3. **使用curl**:curl库可以用于发送HTTP请求,包括GET和POST等。在多线程环境中,我们可以创建多个curl会话,每个会话对应一个线程。通过`curl_multi_init()`初始化一个curl批处理句柄,然后使用`curl_multi_add_...

Global site tag (gtag.js) - Google Analytics