1. 程式人生 > 實用技巧 >jmeter測試udp廣播(jmeter接收udp)

jmeter測試udp廣播(jmeter接收udp)

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