jmeter測試udp廣播(jmeter接收udp)
阿新 • • 發佈:2020-07-26
jmeter測試udp廣播(jmeter接收udp)
jmeter本身不支援udp的測試,下載安裝第三方外掛jmeter-plugins.org之後發現jp@gc - UDP Request只支援傳送udp,不支援接收udp。
所以如果想用jmeter接收udp,必須寫java 請求!!!
如果不熟悉如何開發jmeter的Java請求,可以看之前的文章:jmeter Java請求
下面直接開始寫Java請求:
將log4j2.xml檔案放在專案的classpath裡面(也就是src裡面)
<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!--先定義所有的appender--> <appenders> <!--這個輸出控制檯的配置--> <Console name="Console" target="SYSTEM_OUT"> <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!--這個都知道是輸出日誌的格式--> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用--> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!--這個會打印出所有的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔--> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="50MB"/> </RollingFile> </appenders> <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效--> <loggers> <!--建立一個預設的root的logger--> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> </root> </loggers> </configuration>
另外:自己開發Java請求寫的Java程式碼一定要將apache-jmeter-3.2\lib\ext\下的所有jar包都導進來,
另外還需要導進來D:\apache-jmeter-3.2\lib\junit裡面的test包,還有apache-jmeter-3.2\lib下面的部分包。
JavaTest_getL_udp 的程式碼如下:
package com.test; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //很多問題在於少載入了依賴包,可以把jmeterhome/lib下所有jar載入到External Libraries public class JavaTest_getL_udp extends AbstractJavaSamplerClient { private static final Logger logger = LoggerFactory.getLogger(JavaTest_getL_udp.class); private String port; // private String seconds; // 這個方法是用來自定義java方法入參的 // * params.addArgument("port","");表示入參名字叫port,預設值為空。 @Override public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("port", ""); // params.addArgument("seconds", ""); return params; } // 每個執行緒測試前執行一次,做一些初始化工作 // 獲取輸入的引數,賦值給變數,引數也可以在下面的runTest方法中獲取,這裡是為了展示該方法的作用 @Override public void setupTest(JavaSamplerContext arg0) { port = arg0.getParameter("port"); // seconds = arg0.getParameter("seconds"); } // 真正執行邏輯的方法 @Override public SampleResult runTest(JavaSamplerContext arg0) { SampleResult sr = new SampleResult(); // sr.setSamplerData("埠號port:"+port+"\n迴圈執行時間seconds:"+seconds); // logger.info("埠號port:" + port +" 迴圈執行時間seconds:"+seconds); sr.setSamplerData("埠號port:"+port); logger.info("IP是:127.0.0.1 "+"埠號port:" + port); try { // jmeter 開始統計響應時間標記 sr.sampleStart(); //建立接收端的Socket服務物件,並且指定埠號 DatagramSocket ds = new DatagramSocket(Integer.parseInt(port)); // long start = System.currentTimeMillis(); // long end = start + (Integer.parseInt(seconds))*1000; // seconds * 1000 ms/sec // for (int i = 0;i<100000000;){ //建立一個數據包,用於接收資料 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //接收資料 ds.receive(dp); //獲取ip地址,解析資料 String ip=dp.getAddress().getHostAddress(); // String ip = "192.168.10.222"; //獲取資料 String data = new String(dp.getData(),0,dp.getLength()); logger.info("from " + ip + " data is " + data); // 通過下面的操作就可以將被測方法的響應輸出到Jmeter的察看結果樹中的響應資料裡面了。 sr.setResponseData("接收到udp :"+ data, "utf-8"); sr.setDataType(SampleResult.TEXT); //設定響應執行成功 sr.setSuccessful(true); // i++; // if(System.currentTimeMillis() >= end) break; // } } catch (Throwable e) { //有異常,執行失敗 sr.setSuccessful(false); e.printStackTrace(); } finally { // jmeter 結束統計響應時間標記 sr.sampleEnd(); } return sr; } @Override public void teardownTest(JavaSamplerContext arg0) { } // main方法測試程式是否可用,打包時 註釋掉 public static void main(String[] args) { Arguments params = new Arguments(); //設定引數,並賦予預設值1 params.addArgument("port", "10000"); //params.addArgument("seconds", "1"); JavaSamplerContext arg0 = new JavaSamplerContext(params); JavaTest_getL_udp test = new JavaTest_getL_udp(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); } }
先執行main方法來接收udp,然後再執行jmeter來發送udp
開始執行jmeter 模擬本機發送udp廣播
JavaTest_getL_udp