由于互联网编程实验二第三题要求比较使用线程池与否的服务器的并发性能遂检索信息并了解到Apache JMeter这个工具本文主要介绍了在已有Java JDK的情况下对Apache JMeter的安装及配置以及利用JMeter进行TCP压力测试一、安装及配置先在官网下载压缩包Apache JMeter - Download Apache JMeter将文件apache-jmeter-5.6.3.zip解压到自己选择的目录中在根目录下找到bin文件夹 进入文件夹中找到jmeter.bat双击即可打开软件二、TCP服务器编写Java代码在Server类的main函数中指定一个端口作为服务器端口并在while死循环中不断接收客户端的请求对于每一个请求新开一个线程ThreadServer并在其中处理请求public class Server { static int PORT 9000; static int MAX_POOL 100; public static void main(String[] args) throws IOException { ServerSocket server new ServerSocket(PORT); // without thread pool while (true) { Socket accept server.accept(); Thread thread new Thread(new ThreadServer(accept)); thread.start(); } // with thread pool // ExecutorService service Executors.newFixedThreadPool(MAX_POOL); // while (true) { // Socket accept server.accept(); // service.submit(new ThreadServer(accept)); // } } }代码中将服务器分为两种模式第一段为没有线程池的模式第二段为使用线程池的模式。通过分别注释并重新编译运行来启动不同模式的服务器为了简化服务端和客户端的交互我们在ThreadServer中仅仅打印连接成功以及断开连接的信息而不进行多余的通信如下public class ThreadServer implements Runnable{ Socket socket; static int BUFFER_SIZE 1024; static String EXIT_STR exit; public ThreadServer(Socket socket){ this.socket socket; } Override public void run(){ try{ System.out.println(connection start); OutputStream out socket.getOutputStream(); out.write(connect successfully.getBytes()); // echo service // InputStream in socket.getInputStream(); // byte[] inBytes new byte[BUFFER_SIZE]; // int len; // while((len in.read(inBytes)) ! 0){ // String str new String(inBytes, 0, len); // if(str.equals(EXIT_STR)) // break; // System.out.println(received: str); // out.write(str.getBytes()); // } System.out.println(connection end); socket.close(); }catch (IOException e){ e.printStackTrace(); } } }注释部分是提供echo服务需要客户端同步实现在本题中无需使用客户端参考以下代码public class Client { static String SERVER_HOST 127.0.0.1; static int SERVER_PORT 9000; static int BUFFER_SIZE 1024; static String EXIT_STR exit; public static void main(String[] args) throws IOException { Socket client new Socket(SERVER_HOST, SERVER_PORT); Scanner scanner new Scanner(System.in); OutputStream out client.getOutputStream(); InputStream in client.getInputStream(); byte[] buffer new byte[BUFFER_SIZE]; // echo while(scanner.hasNextLine()){ String lineOfWord scanner.nextLine(); out.write(lineOfWord.getBytes()); if(lineOfWord.equals(EXIT_STR)) break; int len in.read(buffer); System.out.println(echo: new String(buffer, 0, len)); } client.close(); } }三、并发测试1. 创建测试计划打开JMeter右键单击测试计划(test plan)一直选择到新建线程组如下右键单击新建的线程组分别新建TCP Sampler和Response Time Graph分别用于TCP连接以及输出响应时间与时间的折线图注意到TCP Sampler属于Sampler模块我们也可在此模块中选择HTTP Request进行HTTP请求的测试Response Time Graph属于Listener模块我们可以在此模块中选择Aggregate Report输出测试的聚合报告包括响应时间的平均值、最小值以及吞吐量等在TCP Sampler中指定服务器的地址及端口号如下在Response Time Graph指定记录的间隔单位为ms这里设置为10002. 正式测试首先启动服务端D:\idea project\internetprog\exp2\exp2\srcjavac Server.java D:\idea project\internetprog\exp2\exp2\srcjava Server单击Thread Group不断更改以下几个参数测试不同程度的并发下服务的响应时间其中Number of Threads即创建的线程数Ramp-up period即在多长时间内创建以上线程数单位为sLoop Count即执行的次数勾选Infinite代表无限次执行在本例中我选择固定Ramp-up period为1Loop Count为5修改Number of Threads依次为2000、4000、6000、8000以及10000分别对比在有无线程池的服务器中出现较长延迟的响应时间。每种情况分别测试3~5次。测试结果如下线程数无线程池有线程池20001ms内1ms内40001s内1s内60002s内2s内80004s ~ 8s3s ~ 6s1000010s ~ 16s3s ~ 7s可以看出当并发压力增大时无线程池出现的长延迟响应时间相比有线程池的情况增长要快最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】​​​软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。