压测工具

发布于: 2020 年 07 月 19 日

import java.io.*;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.nio.charset.StandardCharsets;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

import java.util.Vector;

import java.util.concurrent.*;

public class PressureTool {

public static class PressureRunnable implements Runnable {

List<Long> runTimeList;

String url;

int nums;

public PressureRunnable(List<Long> runTimeList, String url, int nums) {

this.runTimeList = runTimeList;

this.url = url;

this.nums = nums;

}

public void run() {

for (int i = 0; i < nums; i++) {

long start = System.currentTimeMillis();

doGet(this.url);

long end = System.currentTimeMillis();

runTimeList.add(end - start);

System.out.println("单个线程花费时间:" + (end - start));

}

}

}

public static void main(String[] args) throws Exception {

String uri = args[0];//"https://www.baidu.com/";//

int totalRequests = Integer.parseInt(args[1]);//100;//

int multiNums = Integer.parseInt(args[2]);//10;//

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(

multiNums,

multiNums,

10, TimeUnit.SECONDS,

new ArrayBlockingQueue<Runnable>(totalRequests), new ThreadPoolExecutor.DiscardOldestPolicy());

int mod = totalRequests / multiNums;

List<Future<?>> futureList = new ArrayList<Future<?>>();

Vector<Long> runTimeList = new Vector<Long>();

for (int i = 0; i < multiNums; i++) {

int cur = Math.min(totalRequests, mod);

Future<?> future = threadPool.submit(new PressureRunnable(runTimeList, uri, cur));

futureList.add(future);

totalRequests -= mod;

}

for (Future<?> future : futureList) {

//获取线程执行结果

future.get(multiNums, TimeUnit.SECONDS);

}

runTimeList.sort(Comparator.naturalOrder());

long runTime = 0;

for (int i = 0; i < runTimeList.size(); i++) {

runTime = runTimeList.get(i) + runTime;

}

System.out.println("平均响应时间: " + runTime / runTimeList.size());

System.out.println("95% 响应时间: " + runTimeList.get((int)Math.round(runTimeList.size()*0.95)));

}

public static String doGet(String httpUrl) {

//链接

HttpURLConnection connection = null;

InputStream is = null;

BufferedReader br = null;

StringBuilder result = new StringBuilder();

try {

//创建连接

URL url = new URL(httpUrl);

connection = (HttpURLConnection) url.openConnection();

//设置请求方式

connection.setRequestMethod("GET");

//设置连接超时时间

connection.setReadTimeout(15000);

//开始连接

connection.connect();

//获取响应数据

if (connection.getResponseCode() == 200) {

//获取返回的数据

is = connection.getInputStream();

if (null != is) {

br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));

String temp = null;

while (null != (temp = br.readLine())) {

result.append(temp);

}

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (null != br) {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != is) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

//关闭远程连接

if (connection != null) {

connection.disconnect();

}

}

return result.toString();

}

public static String doPost(String httpUrl, String param) {

StringBuilder result = new StringBuilder();

//连接

HttpURLConnection connection = null;

OutputStream os = null;

InputStream is = null;

BufferedReader br = null;

try {

//创建连接对象

URL url = new URL(httpUrl);

//创建连接

connection = (HttpURLConnection) url.openConnection();

//设置请求方法

connection.setRequestMethod("POST");

//设置连接超时时间

connection.setConnectTimeout(15000);

//设置读取超时时间

connection.setReadTimeout(15000);

//DoOutput设置是否向httpUrlConnection输出,DoInput设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个

//设置是否可读取

connection.setDoOutput(true);

connection.setDoInput(true);

//设置通用的请求属性

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.setRequestProperty("Content-Type", "application/json;charset=utf-8");

//拼装参数

if (null != param && param.equals("")) {

//设置参数

os = connection.getOutputStream();

//拼装参数

os.write(param.getBytes("UTF-8"));

}

//设置权限

//设置请求头等

//开启连接

//connection.connect();

//读取响应

if (connection.getResponseCode() == 200) {

is = connection.getInputStream();

if (null != is) {

br = new BufferedReader(new InputStreamReader(is, "GBK"));

String temp = null;

while (null != (temp = br.readLine())) {

result.append(temp);

result.append("\r\n");

}

}

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

//关闭连接

if (br != null) {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (os != null) {

try {

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

//关闭连接

if (connection != null) {

connection.disconnect();

}

}

return result.toString();

}

}

用户头像

Karl

关注

还未添加个人签名 2020.02.13 加入

还未添加个人简介

评论

发布
暂无评论
压测工具