• Jmeter自定义编写Java代码调用socket通信


     一、前言

    最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法。性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够运行,依照这个思路,测试该手游的性能就化为对服务器的性能测试,也就是服务器和手机客户端所联系的接口的测试。

    如果是可以用HTTP调用的,那样很好解决,直接带上地址参数就OK,开始一两个很顺利,设计参数化了一下数据就很顺利的解决,然后,遇到了一个切换场景的接口,用的是socket通信,再用上述方法貌似不可行,然后偶很懒,所以折腾了一天,结果,还是没有找到好的办法,无奈,想到了Jmeter可以调用java请求,只好到开发那边拿到协议,通过自定义编写java代码来实现socket通信,连接成功,返回数据成功。顺便说一句,Jmeter真是居家旅行必备~~~~

     首先,Jmeter使用自定义编写代码的步骤:http://www.cnblogs.com/linglingyuese/articles/linglingyuese-two.html

    二、代码

    SocketClient.java类

    package app;
    
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.net.Socket;
    
    public class SocketClient {
        
        public boolean sendMessage(String ipAddress,int port,String data){
            try {
                Socket socket=new Socket(ipAddress,port);
                DataInputStream  input=new DataInputStream(socket.getInputStream());
                DataOutputStream output = new DataOutputStream(socket.getOutputStream());
                
                byte[] message=data.getBytes("UTF-8");
                
                //获得长度
                int length=message.length;
                
                message[0] = (byte) 0x00;
                message[length-1] = (byte) 0xff;
                
                output.write(message);
                output.flush();
                System.out.println(message);
                Thread.sleep(1000);
                if (!socket.isClosed() && socket.isConnected()) {
                    byte[] cbuf=new byte[8096];
                    input.read(cbuf);
                    System.out.println("读取到的是:"+cbuf);
                    String responseLine=new String(cbuf);  
                    System.out.println(responseLine+"===========");
                }
                output.close();
                input.close();
                
                socket.close();
                
                return true;
            } catch (Exception e) {
                return false;
            }
        }
    }

    TestScence.java类

    package app;
    
    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 TestScence extends AbstractJavaSamplerClient {
        
        private SampleResult results;
        
        private String ipAddress;
        
        private String port;
        
        private String data;
    
        /**
         * 初始化方法
         */
        public void setupTest(JavaSamplerContext jsc) {
            results = new SampleResult();
            
            ipAddress = jsc.getParameter("ipAddress", "");
            port = jsc.getParameter("port", "");
            data = jsc.getParameter("data", "");
            
            if (ipAddress != null && ipAddress.length() > 0){
                results.setSamplerData(ipAddress);
            }
            
            if (port != null && port.length() > 0){
                results.setSamplerData(port);
            }
            
            if (data != null && data.length() > 0){
                results.setSamplerData(data);
            }
    
        }
        
        /**
         * 设置传入参数
         */
        public Arguments getDefaultParameters() {
            Arguments params = new Arguments();
            
            params.addArgument("ipAddress", "");
            params.addArgument("port", "");
            params.addArgument("data", "");
            
            
            return params;
        }
    
        /**
         * 线程运行体
         */
        public SampleResult runTest(JavaSamplerContext arg0) {
            SocketClient sc = new SocketClient();
            
            int port2 = 50001;
            
            if (port != null && port.length() > 0){
                port2 = Integer.parseInt(port);
            }
            
            results.sampleStart();
            
            boolean flag = sc.sendMessage(ipAddress, port2, data);
            
            results.sampleEnd();
            
            if (flag){
                results.setSuccessful(true);
            }else{
                results.setSuccessful(false);
            }
            
            return results;
        }
    
        /**
         * 结束方法
         */
        public void teardownTest(JavaSamplerContext arg0) {
    
        }
    
    }

     

    三、导出为可以使Jmeter读取的jar包

    在项目的根节点,右击选择【Export】,选择java下面的【JAR file】 

    然后一直点击下一步即可。

    将导出的jar包放到如下目录:apache-jmeter-2.9libext,然后重新启动Jmeter啊,新建java请求,就可以看到你刚刚写的java类啦,填写上相关的参数就可以啦。

    测试不到一年,对性能啥的理解还不是太深,各位大神不要较真~~~~

  • 相关阅读:
    [置顶] 内外网同时访问,我的拿来主义
    Nginx防攻击工具教程一 ngx_http_limit_conn_module
    晒晒我的厨艺修炼成果
    在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?
    无法解析的外部符号__imp__AlphaBlend@44的解决
    Win32 API实现CDC类的FillSolidRect接口
    pugixml库学习之添加节点
    cleanup failed because the file not under version control问题的解决
    JavaScript 的 typeof 的用途
    支持在Win7和XP系统上创建环境变量的批处理文件
  • 原文地址:https://www.cnblogs.com/linglingyuese/p/linglingyuese_sex.html
Copyright © 2020-2023  润新知