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

菜鸟,多线程好玩就写着玩。大神能够路过不吝赐教。小弟在这受教。谢谢!

很多其它分享请关注微信公众号:lvxing1788

~~~~~~
切割线扭起来 ~~~~~~

  1. /**
  2. * @组件名:javaDemo
  3. * @包名:javaDemo
  4. * @文件名称:Jenny.java
  5. * @创建时间: 2014年8月1日 下午5:53:48
  6. * @版权信息:Copyright © 2014 eelly Co.Ltd,小姨子版权全部。
  7. */
  8.  
  9. package javaDemo;
  10.  
  11. import java.io.BufferedReader;
  12. import java.io.File;
  13. import java.io.FileWriter;
  14. import java.io.IOException;
  15. import java.io.InputStreamReader;
  16. import java.io.PrintWriter;
  17. import java.io.Writer;
  18. import java.net.URL;
  19. import java.net.URLConnection;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Random;
  23.  
  24. /**
  25. * 用于异常的抛出而定义,由于Exception不能抛出。仅仅有子类才干
  26. */
  27. class MyException extends Exception {
  28.  
  29. private static final long serialVersionUID = -1485825968429580934L;
  30.  
  31. public MyException() {
  32. super();
  33. }
  34.  
  35. public MyException(String msg) {
  36. super(msg);
  37. }
  38.  
  39. public MyException(String msg, Throwable cause) {
  40. super(msg, cause);
  41. }
  42.  
  43. public MyException(Throwable cause) {
  44. super(cause);
  45. }
  46. }
  47.  
  48. /**
  49. * 一个小姨子须要的线程类
  50. */
  51. class ShiMengRen implements Runnable {
  52.  
  53. /**
  54. * 浏览量的链接
  55. */
  56. private String url = "http://www.*******.com/article/yj/views.jhtml";
  57.  
  58. /**
  59. * 点赞的链接
  60. */
  61. private String urlZan = "http://www.********.com/article/yj/ups.jhtml";
  62.  
  63. /**
  64. * 游记的ID
  65. */
  66. private String param = "article_id=10844";
  67.  
  68. /**
  69. * 多线程共享的全局变量
  70. */
  71. // private volatile boolean flag = true;
  72.  
  73. /**
  74. * 同一时候进入post提交的线程数
  75. */
  76. private static final int MAX_THREAD_COUNT = 25;
  77.  
  78. /**
  79. * 同一时候进入post提交的线程数的计数器
  80. */
  81. private volatile static int threadNum = 0;
  82.  
  83. /**
  84. * 计数
  85. */
  86. private static int num = 0;
  87.  
  88. /**
  89. * 浏览次数
  90. */
  91. private static int view = 0;
  92.  
  93. /**
  94. * 代理IP
  95. */
  96. private String[] proxyArray = { "127.0.0.1:8787", "115.239.210.199:80", "149.255.255.242:80",
  97. "124.172.242.175:80", "117.59.217.243:80", "183.234.59.89:18186", "117.59.217.236:80",
  98. "183.224.1.56:80", "120.202.249.230:80", "125.46.100.198:9999", "112.65.19.122:8080",
  99. "202.96.172.234:808", "183.224.1.114:80", "183.224.1.113:80", "222.66.115.229:80" };
  100.  
  101. // public void setFlag(boolean flag) {
  102. // this.flag = flag;
  103. // }
  104. //
  105. // public boolean getFlag() {
  106. // return this.flag;
  107. // }
  108. //
  109. // public void stop() {
  110. // this.setFlag(false);
  111. // }
  112. //
  113. // public void start() {
  114. // this.setFlag(true);
  115. // }
  116.  
  117. public void setNum(int num) {
  118. ShiMengRen.num = num;
  119. }
  120.  
  121. public int getNum() {
  122. return ShiMengRen.num;
  123. }
  124.  
  125. public void setThreadNum(int threadNum) {
  126. ShiMengRen.threadNum = threadNum;
  127. }
  128.  
  129. public int getThreadNum() {
  130. return ShiMengRen.threadNum;
  131. }
  132.  
  133. public int getView() {
  134. return ShiMengRen.view;
  135. }
  136.  
  137. /**
  138. * @方法名:getProxy
  139. * @描写叙述:随机获代替理IP
  140. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  141. * @改动人:
  142. * @改动时间:2014年8月18日 上午9:23:36
  143. * @return
  144. * @返回值:String[]
  145. * @异常说明:
  146. */
  147. public String[] getProxy() {
  148. String[] strlist = null;
  149. int len = proxyArray.length - 1;
  150. int num = 0;
  151. if (0 < len) {
  152. num = new Random().nextInt(len);
  153. }
  154. String proxy = this.proxyArray[num];
  155. if (proxy != "") {
  156. strlist = proxy.split(":");
  157. }
  158.  
  159. return strlist;
  160. }
  161.  
  162. /**
  163. * @方法名:sendGet
  164. * @描写叙述:向指定URL发送GET方法的请求
  165. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  166. * @改动人:
  167. * @改动时间:2014年8月18日 上午9:26:27
  168. * @param url
  169. * 发送请求的URL
  170. * @param param
  171. * 请求參数,请求參数应该是 name1=value1&name2=value2 的形式。
  172. * @return URL 所代表远程资源的响应结果
  173. * @返回值:String
  174. * @异常说明:
  175. */
  176. public String sendGet(String url, String param) {
  177. String result = "";
  178. BufferedReader in = null;
  179.  
  180. String[] proxyList = this.getProxy();
  181. if (null != proxyList) {
  182. System.setProperty("http.proxySet", "true");
  183. System.setProperty("http.proxyHost", proxyList[0]);
  184. System.setProperty("http.proxyPort", proxyList[1]);
  185. }
  186. try {
  187. String urlNameString = url + "?
  188.  
  189. " + param;
  190. URL realUrl = new URL(urlNameString);
  191. // 打开和URL之间的连接
  192. URLConnection connection = realUrl.openConnection();
  193. // 设置通用的请求属性
  194. connection.setRequestProperty("accept", "*/*");
  195. connection.setRequestProperty("connection", "Keep-Alive");
  196. connection.setRequestProperty("user-agent",
  197. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  198. // 建立实际的连接
  199. connection.connect();
  200. // 获取全部响应头字段
  201. Map<String, List<String>> map = connection.getHeaderFields();
  202. // 遍历全部的响应头字段
  203. for (String key : map.keySet()) {
  204. System.out.println(key + "--->" + map.get(key));
  205. }
  206. // 定义 BufferedReader输入流来读取URL的响应
  207. in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  208. String line;
  209. while ((line = in.readLine()) != null) {
  210. result += line;
  211. }
  212. } catch (Exception e) {
  213. System.out.println("发送GET请求出现异常!" + e);
  214. e.printStackTrace();
  215. }
  216. // 使用finally块来关闭输入流
  217. finally {
  218. try {
  219. if (in != null) {
  220. in.close();
  221. }
  222. } catch (Exception e2) {
  223. e2.printStackTrace();
  224. }
  225. }
  226.  
  227. return result;
  228. }
  229.  
  230. /**
  231. * @方法名:sendPost
  232. * @描写叙述:向指定 URL 发送POST方法的请求
  233. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  234. * @改动人:
  235. * @改动时间:2014年8月18日 上午9:29:09
  236. * @param url
  237. * 发送请求的 URL
  238. * @param param
  239. * 请求參数。请求參数应该是 name1=value1&name2=value2 的形式。
  240.  
  241. * @return 所代表远程资源的响应结果
  242. * @throws Exception
  243. * @返回值:String
  244. * @异常说明:
  245. */
  246. public String sendPost(String url, String param) throws Exception {
  247. PrintWriter out = null;
  248. BufferedReader in = null;
  249. String result = "";
  250.  
  251. String[] proxyList = this.getProxy();
  252. if (null != proxyList) {
  253. System.setProperty("http.proxySet", "true");
  254. System.setProperty("http.proxyHost", proxyList[0]);
  255. System.setProperty("http.proxyPort", proxyList[1]);
  256. }
  257. try {
  258. URL realUrl = new URL(url);
  259. // 打开和URL之间的连接
  260. URLConnection conn = realUrl.openConnection();
  261. // 设置通用的请求属性
  262. conn.setRequestProperty("accept", "*/*");
  263. conn.setRequestProperty("connection", "Keep-Alive");
  264. conn.setRequestProperty("user-agent",
  265. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  266. // 发送POST请求必须设置例如以下两行
  267. conn.setDoOutput(true);
  268. conn.setDoInput(true);
  269. // 获取URLConnection对象相应的输出流
  270. out = new PrintWriter(conn.getOutputStream());
  271. // 发送请求參数
  272. out.print(param);
  273. // flush输出流的缓冲
  274. out.flush();
  275. // 定义BufferedReader输入流来读取URL的响应
  276. in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  277. String line;
  278. while ((line = in.readLine()) != null) {
  279. result += line;
  280. }
  281. } catch (Exception e) {
  282. throw new MyException("发送 POST 请求出现异常!" + e);
  283. // System.out.println("发送 POST 请求出现异常!" + e);
  284. // e.printStackTrace();
  285. }
  286. // 使用finally块来关闭输出流、输入流
  287. finally {
  288. try {
  289. if (out != null) {
  290. out.close();
  291. }
  292. if (in != null) {
  293. in.close();
  294. }
  295. } catch (IOException ex) {
  296. throw new MyException("发送 POST 请求出现异常!
  297.  
  298. " + ex);
  299. // ex.printStackTrace();
  300. }
  301. }
  302.  
  303. return result;
  304. }
  305.  
  306. /**
  307. * @方法名:plusNum
  308. * @描写叙述:总线程数的计数
  309. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  310. * @改动人:
  311. * @改动时间:2014年8月18日 上午9:29:53
  312. * @返回值:void
  313. * @异常说明:
  314. */
  315. public void plusNum() {
  316. ShiMengRen.num++;
  317. }
  318.  
  319. /**
  320. * @方法名:reductionNum
  321. * @描写叙述:总线程数的计数
  322. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  323. * @改动人:
  324. * @改动时间:2014年8月18日 上午9:30:03
  325. * @返回值:void
  326. * @异常说明:
  327. */
  328. public void reductionNum() {
  329. ShiMengRen.num--;
  330. ShiMengRen.num = ShiMengRen.num < 0 ? 0 : ShiMengRen.num;
  331. }
  332.  
  333. /**
  334. * @方法名:plusThreadNum
  335. * @描写叙述:并发线程数计数(事实上也不算是并发),使用同步标识符,防止多线程的干扰
  336. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  337. * @改动人:
  338. * @改动时间:2014年8月18日 上午9:30:22
  339. * @返回值:void
  340. * @异常说明:
  341. */
  342. public synchronized void plusThreadNum() {
  343. ShiMengRen.threadNum++;
  344. }
  345.  
  346. /**
  347. * @方法名:reductionThreadNum
  348. * @描写叙述:并发线程数计数(事实上也不算是并发),使用同步标识符,防止多线程的干扰
  349. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  350. * @改动人:
  351. * @改动时间:2014年8月18日 上午9:30:28
  352. * @返回值:void
  353. * @异常说明:
  354. */
  355. public synchronized void reductionThreadNum() {
  356. ShiMengRen.threadNum--;
  357. ShiMengRen.threadNum = ShiMengRen.threadNum < 0 ? 0 : ShiMengRen.threadNum;
  358. }
  359.  
  360. /**
  361. * @方法名:plusView
  362. * @描写叙述:浏览量计数。使用同步标识符。防止多线程的干扰
  363. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  364. * @改动人:
  365. * @改动时间:2014年8月18日 上午9:30:33
  366. * @返回值:void
  367. * @异常说明:
  368. */
  369. public synchronized void plusView() {
  370. ShiMengRen.view++;
  371. }
  372.  
  373. /**
  374. * @方法名:runShiMengRen
  375. * @描写叙述:调用sendPost的方法,以及各种计数
  376. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  377. * @改动人:
  378. * @改动时间:2014年8月18日 上午9:30:37
  379. * @throws MyException
  380. * @throws InterruptedException
  381. * @返回值:void
  382. * @异常说明:
  383. */
  384. public void runShiMengRen() throws MyException, InterruptedException {
  385. this.plusNum();
  386. try {
  387. Thread.sleep(new Random().nextInt(2000));
  388. if (ShiMengRen.MAX_THREAD_COUNT > this.getThreadNum()) {
  389. this.plusThreadNum(); // 计数器自增
  390. String result = sendPost(this.url, this.param); // 刷浏览数
  391. sendPost(this.urlZan, this.param); // 刷点赞数
  392. if (result.equals("1")) {
  393. this.plusView();
  394. this.jennyLog("浏览次数:" + this.getView() + "\n");
  395. }
  396. }
  397. } catch (Exception e) {
  398. Thread.sleep(2000);
  399. throw new MyException("站点出现异常,停止全部线程.");
  400. }
  401.  
  402. finally {
  403. System.out.println("等待运行线程队列:" + this.getNum() + "。当前异步线程数量:" + this.getThreadNum()
  404. + ",浏览次数:" + this.getView());
  405. this.reductionNum();
  406. this.reductionThreadNum();
  407. }
  408. }
  409.  
  410. /**
  411. * @方法名:jennyLog
  412. * @描写叙述:小姨子的日志记录,仅仅为看浏览量的变化
  413. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  414. * @改动人:
  415. * @改动时间:2014年8月18日 上午9:30:52
  416. * @param data
  417. * @throws IOException
  418. * @返回值:void
  419. * @异常说明:
  420. */
  421. public void jennyLog(String data) throws IOException {
  422. File file = new File("/home/beyond/tmp/Jenny.log.txt");
  423. // File file = new File("E:\\Jenny.log.txt");
  424. if (!file.getParentFile().exists()) {
  425. file.getParentFile().mkdirs();
  426. }
  427. Writer out = new FileWriter(file);
  428. out.write(data);
  429. out.close();
  430. }
  431.  
  432. /**
  433. * <p>
  434. * 主题:run
  435. * </p>
  436. * <p>
  437. * 描写叙述:往死里拼命的Post提交数据
  438. * </p>
  439. *
  440. * @see java.lang.Runnable#run()
  441. */
  442. @Override
  443. public void run() {
  444. for (;;) {
  445. try {
  446. this.runShiMengRen();
  447. } catch (Exception e) {
  448. System.out.println("发送 POST 请求出现异常.");
  449. }
  450. }
  451. }
  452. }
  453.  
  454. /**
  455. * @类名:Jenny
  456. * @描写叙述:小姨子类
  457. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  458. * @改动人:
  459. * @改动时间:2014年8月1日 下午5:53:48
  460. * @改动说明:<br/>
  461. * @版本号信息:V1.0.0<br/>
  462. */
  463. public class JennyThread {
  464.  
  465. /**
  466. * @方法名:main
  467. * @描写叙述:小姨子的主方法
  468. * @创建人:<a href=mailto: 529901956@qq.com>小姨子的姐夫</a>
  469. * @改动人:
  470. * @改动时间:2014年8月1日 下午5:53:48
  471. * @param args
  472. * @throws Exception
  473. * @返回值:void
  474. * @异常说明:
  475. */
  476. public static void main(String[] args) {
  477. Runnable t = new ShiMengRen();
  478. for (int i = 0; i < 60; i++) {
  479. new Thread(t, "Thread-" + i).start();
  480. }
  481. }
  482. }

~~~~~~ 切割线扭起来 ~~~~~~

很多其它分享请关注微信公众号:lvxing1788

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

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

    Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...

  2. Java 中传统多线程

    目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...

  3. 【转】Java中的多线程学习大总结

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. java中的多线程 // 基础

    java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...

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

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  7. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  8. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  9. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

随机推荐

  1. MongoDB实现数组中重复数据删除

    这个功能真的是写死我了,对于MongoDB一点都不熟悉,本来想使用spring与MongoDB的融合mongoDBTemplate,发现压根不是web项目,懒得配置那些配置文件,就使用最原始的数据库操 ...

  2. AtCoder Beginner Contest 054

    1. A - One Card Poker 水题,直接输出大小. 2. B - Template Matching 暴力,每个位置枚举,比较. 3. C - One-stroke Path n的大小只 ...

  3. ASCII和ASCII扩展表

  4. JS 经验总结

    1.IE中div的高度是content+padding+border之和,其它的是content的高度 2.一个标签里面只有一个属性,class='cls1 cls2' 3.同一页面不能出现相同的id ...

  5. ViewData与ViewBag的使用区别

    在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...

  6. Python 实现简单图片验证码登录

    朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ...

  7. echarts 圆形图、柱状图

    首先引入echarts的js包 <script type="text/javascript" src="js/esl.js"></script ...

  8. SQL Server-聚焦过滤索引提高查询性能

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  9. [oracle] 递归追溯完整部门名称 函数

    create or replace function fn_DeptWholeName2(objectid in number) return nvarchar2 is wholename nvarc ...

  10. 读书笔记「Python编程:从入门到实践」_3.列表简介

    3.1 列表是什么 列表 由一系列按特定顺序排列的元素组成. 在Python中,用方括号([] )来表示列表,并用逗号来分隔其中的元素. 3.1.1 访问列表元素 指出列表的名称,再指出元素的索引   ...