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
相关推荐
本文将深入探讨如何使用C++通过HTTP协议实现多线程并发地发送POST和GET请求,以及如何将返回的数据展示到用户界面。我们将围绕“通过HTTP多线程并发post/get数据”这一主题,结合使用VC++6.0作为编译环境来阐述相关...
因此,在实际应用中,需要适当控制并发数量,考虑使用代理IP池,以及合理地释放和重用cURL句柄以优化性能。 在标签"类库下载-php的curl多线程采集"中,我们可以理解为可能包含了实现这一功能的相关类库或脚本。在...
在Java编程领域,构建一个简易的多线程HTTP服务器是一项常见的练习,这有助于理解网络通信、线程管理和HTTP协议的基本原理。在这个项目中,我们利用Java的线程池和Socket库来实现这样一个服务器,它支持GET、POST...
在PHP中,可以使用cURL进行多线程GET或POST请求,提高数据处理的效率。 3. OWIN+AspNet.Identity: OWIN是一种用于.NET应用的中间件接口,它允许.NET应用程序与Web服务器进行解耦,更容易地编写独立于具体服务器的...
3. **非阻塞模式**:在多线程环境中,可以将`curl_multi_exec()`放入一个循环,使用`curl_multi_select()`或`stream_select()`函数来判断是否有可读写事件发生,这样可以避免程序在等待I/O时浪费CPU资源。...
- 记得在每个线程中独立初始化和清理curl,以避免线程安全问题。 - 如果使用动态库,确保在所有需要curl的进程中都能访问到.dll文件。 通过这个简单的Qt工程,你已经掌握了如何在Qt中使用curl进行网络请求的基础...
在这个场景中,我们关注的工具支持两种主要的HTTP请求方法:POST和GET。 **POST方法**是HTTP请求中最常见的一种,用于向服务器提交数据。当你在网页上填写表单并点击“提交”按钮时,通常就是使用的POST方法。它将...
PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...
Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua脚本能够方便地与Web服务进行交互,比如发送GET、POST请求,处理cookies,上传文件,...
CUrlHttp封装curl类是一个基于curl库的PHP类,它为开发者提供了更加便捷的方式来执行HTTP请求,如GET、POST以及表单提交等操作。curl库是一个强大的URL传输库,广泛应用于各种网络请求任务,包括文件上传下载、网页...
本项目中,我们关注的是GET和POST两种请求方式,以及它们的同步和异步实现。下面将详细介绍这两种请求方式以及同步与异步的区别。 1. **QT中的HTTP GET请求** GET请求是最常见的HTTP请求类型,用于从服务器获取资源...
在PHP中,cURL库允许开发者创建HTTP请求,模拟浏览器行为,包括提交表单、处理cookies和执行POST请求等。在本项目中,cURL将用于发送HTTP GET请求到百度的搜索接口,以检查特定URL是否被百度收录。 要实现多线程...
- `CURL使用指南.doc`、`CURL详解.doc`、`curl 也玩多线程.doc`、`curl应用总结.doc`、`cURL使用心得.doc`:这些文档提供了更详细的`curl`使用教程和实践经验。 - `curl.pdf`:可能是官方或第三方编写的`curl`用户...
- 考虑使用异步I/O或多线程技术提高并发处理能力。 - 缓存机制可以减少不必要的网络请求,提高响应速度。 - 优化内存管理,避免内存泄漏。 总之,通过C++实现HTTP协议的GET和POST方法,不仅需要理解HTTP协议的...
在Java编程中,多线程和线程安全是核心概念,尤其在开发高效、响应迅速的应用时更是不可或缺。本实践项目以HTTP协议为基础,探讨如何实现断点续传功能,这是在网络上传输大文件时非常实用的一个特性。下面将详细阐述...
在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他编程语言(如C++)进行交互。JNI在很多场景下都很有用,比如优化性能、调用系统底层库或者像本例中那样,利用C/C++库来实现特定功能。...
开发过程中,还需要考虑性能优化,例如使用多线程或多进程模型来处理并发请求,或者使用epoll()进行高效I/O事件管理。此外,错误处理和日志记录也是必不可少的部分,以确保服务器的稳定运行。 为了调试和测试,...
3. **使用curl**:curl库可以用于发送HTTP请求,包括GET和POST等。在多线程环境中,我们可以创建多个curl会话,每个会话对应一个线程。通过`curl_multi_init()`初始化一个curl批处理句柄,然后使用`curl_multi_add_...