jmeter发送字节组 UDP包

本文介绍如何在面临项目需求进行UDP性能测试时,由于JMeter的UDP Request不支持发送字节组,以及Bean Shell无法将byte数组存入变量的问题,通过自定义Java请求来解决。首先,在Eclipse中新建项目并导入jmeter相关库,创建一个类继承AbstractJavaSamplerClient。编写代码后,将项目导出为jar文件放入jMeter的lib/ext目录,重启jMeter,新建Java请求并设置参数,即可完成UDP字节组的发送。

项目要求测试UDP的性能测试,jmeter的 UDP request好像不能发送字节组,bean shell 好像也不能把byte数组存入变量。

那只能自己写java请求了。

那就开始吧。


在ecplise中新建项目,导入下图两个jmeter包。在两个包在jmeter安装路径/lib/ext/下。



新建一个类,继承AbstractJavaSamplerClient 

直接上代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.*;


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;



public class perftest extends AbstractJavaSamplerClient {
   private String a;
   private String[] b;

   private String now;

            //项目的加解密用到

   private String aes_key="O2KCeMuWTsO+KAEI8tl3IA==";
    private String iv="k/GKAF24LfiVddp68ceFVA==";
   /** Holds the result data (shown as Response Data in the Tree display). */
   private String resultData;


   // 这个方法是用来自定义java方法入参的。
   // params.addArgument("num1","");表示入参名字叫num1,默认值为空。
   //设置可用参数及的默认值;
   public Arguments getDefaultParameters() {
       Arguments params = new Arguments();
       params.addArgument("num1", "");
       return params;
   }


   //每个线程测试前执行一次,做一些初始化工作;
   public void setupTest(JavaSamplerContext arg0) {
   }


   //开始测试,从arg0参数可以获得参数值;
   public SampleResult runTest(JavaSamplerContext arg0) {
       a = arg0.getParameter("num1");
       b=a.trim().split(" ");
       now=Long.toHexString(Calendar.getInstance().getTimeInMillis()/1000);
       SampleResult sr = new SampleResult();
       for(int i=0;i<4;i++){
b[i+2]=now.substring(i*2, i*2+2);
b[i+6]="0";
} 
       byte[] bytes = new byte[b.length];
       for(int i = 0; i <b.length; i++) {
           bytes[i] = (byte) Integer.parseInt(b[i], 16);
       }
       
       try {
       	byte[] da=AesCBC.encByAes(bytes, aes_key, iv);
       	sr.sampleStart();// jmeter 开始统计响应时间标记
       	try (DatagramSocket socket = new DatagramSocket(0)) {
           socket.setSoTimeout(10000);
           InetAddress host = InetAddress.getByName("172.28.20.97");
           //指定包要发送的目的地
           DatagramPacket request = new DatagramPacket(da,da.length, host,5683);
          
           //为接受的数据包创建空间
           //DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
           socket.send(request);
           //socket.receive(response);
           //String result = new String(response.getData(), 0, response.getLength(), "ASCII");
           //System.out.println(result);
       } catch (IOException e) {
           e.printStackTrace();
       }

           
           // 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
for(byte e:da){
   	if(resultData==null||"".equals(resultData)){
   	resultData=Integer.toHexString(e & 0xff);
   	}else{
   	resultData=resultData+" "+Integer.toHexString(e & 0xff);;
        }
   }
           if (resultData != null && resultData.length() > 0) {
               sr.setResponseData("结果是:"+resultData, null);
               sr.setDataType(SampleResult.TEXT);
           }
           // System.out.println(resultData);
           sr.setSuccessful(true);
       } catch (Throwable e) {
           sr.setSuccessful(false);
           e.printStackTrace();
       } finally {
           sr.sampleEnd();// jmeter 结束统计响应时间标记
       }
       return sr;
   }


   //测试结束时调用;
   public void teardownTest(JavaSamplerContext arg0) {
       // System.out.println(end);
       // System.out.println("The cost is"+(end-start)/1000);
   }
   
   // main只是为了调试用,最后打jar包的时候注释掉。
   /*
     public static void main(String[] args) 
     { // TODO Auto-generated method stub
         Arguments params = new Arguments(); 
         params.addArgument("num1", "1");//设置参数,并赋予默认值1 
         params.addArgument("num2", "2");//设置参数,并赋予默认值2
         JavaSamplerContext arg0 = new JavaSamplerContext(params); 
         perftestbbb test = new perftestbbb(); 
         test.setupTest(arg0); 
         test.runTest(arg0);
         test.teardownTest(arg0); 
     }
    */
}



然后导出jar文件,放到jmeter/lib/ext下。重启jmeter,新建java请求,填入参数化的数据num1,就可以啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值