51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2701|回复: 4
打印 上一主题 下一主题

mina socket登录性能测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-25 12:08:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 重爱 于 2016-5-25 12:41 编辑

mina socket 做的登录,客户端的原理,先生成json串(这个是我们拼接的发送报文,其中的用户名等要做参数化),再进行加密(加密规则问开发),再进行gzip加压,生成iobuffer,向服务端发送。
服务端原理,有个IP,一个端口,监听来自客户端的请求,接收iobuffer,进行gunzip解压,解密。转成json串。响应后再按加密和gzip发给客户端
客户端接收到服务端的响应信息,再进行gunzip解压,解密后转后json串(这个是我们判断响应是否正确的地方)


1.使用抓包工具,发现iobuffer的字节流没办法找出做参数化规律
2.便想从json串的地方开始做参数化,然后去查看工程,断点发登录的过程,得到json串。再找出加密和加压规则,生成iobuffer
3.eclipse写成的脚本

  1. <blockquote>package com.test;
复制代码


4.转成jmeter脚本
  1. package jmeter;

  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import net.sf.json.JSONObject;  

  6. import org.apache.jmeter.config.Arguments;
  7. import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
  8. import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
  9. import org.apache.jmeter.samplers.SampleResult;

  10. /**
  11. *  socket 测试jmeter脚本
  12. * @author wenhuang
  13. *
  14. */
  15. public class LoginSocketTestJmeter extends AbstractJavaSamplerClient {
  16.         private String Ip;
  17.     private int Post;
  18.     private String user;
  19.     private String password;
  20.     private String resultData;

  21.     // 这个方法是用来自定义java方法入参的。
  22.     //设置可用参数及的默认值;
  23.     public Arguments getDefaultParameters() {
  24.         Arguments params = new Arguments();
  25.         params.addArgument("Ip", "192.168.1.1");
  26.         params.addArgument("Post", "1111");
  27.         params.addArgument("user", "test");
  28.         params.addArgument("password", "1111");
  29.         return params;
  30.     }

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

  34.     //开始测试,从arg0参数可以获得参数值;
  35.     public SampleResult runTest(JavaSamplerContext arg0) {
  36.             Ip = arg0.getParameter("Ip");
  37.             Post = arg0.getIntParameter("Post");
  38.             user = arg0.getParameter("user");
  39.             password = arg0.getParameter("password");
  40.             
  41.       String json = "{\"test\":0,\"data\":{\"user\":\""+user+"\",\"password\":\""+password+"\"},\"key\":\"0\"}";
  42.         
  43.         SampleResult sr = new SampleResult();
  44.         sr.setSampleLabel("登录");  //设置样品标签
  45.         sr.setResponseMessage("请求的JSON: "+ json);
  46.         try {
  47.             sr.sampleStart();// jmeter 开始统计响应时间标记
  48.             
  49.           //1.创建客户端Socket,指定服务器地址和端口
  50.           Socket socket=new Socket(Ip, Post);
  51.                 //2.获取输出流,向服务器端发送信息
  52.                 OutputStream os=socket.getOutputStream();//字节输出流               
  53.                 os.write(getSendHex(json));
  54.                 os.flush();
  55.                
  56.                 //3.获取输入流,并读取服务器端的响应信息
  57.                 InputStream is=socket.getInputStream();               
  58.                 resultData = getReceiveJson(is);

  59.                 //4.关闭资源
  60.                 if(os != null){  
  61.               os.close();  
  62.           }  
  63.           if(is != null){  
  64.               is.close();  
  65.           }
  66.           if(socket != null){  
  67.                   socket.close();  
  68.           }

  69.           System.out.println("接收到的json ="+resultData);
  70.           JSONObject jsonObj = JSONObject.fromObject(resultData);
  71.           String codeNum = jsonObj.get("code").toString();
  72.           if (Integer.parseInt(codeNum) == 200){
  73.                   sr.setSuccessful(true);
  74.                   System.out.println("登录成功,返回code ="+codeNum);        
  75.               //sr.setResponseMessage("请求的JSON: "+ json + " 登录成功,返回code ="+codeNum);        //输出在查看结果树-的取样器结果中
  76.           }else{
  77.                   sr.setSuccessful(false);
  78.                   System.out.println("登录失败,返回code ="+codeNum);
  79.                   //sr.setResponseMessage("请求的JSON: "+ json + " 登录失败,返回code ="+codeNum);
  80.           }
  81.       
  82.           // 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
  83.           if (resultData != null && resultData.length() > 0) {
  84.               sr.setResponseData("返回结果是:"+resultData, null);  //输出在查看结果树-的响应结果中
  85.               sr.setDataType(SampleResult.TEXT);
  86.           }
  87.           // System.out.println(resultData);
  88.             
  89.         } catch (Throwable e) {
  90.             sr.setSuccessful(false);
  91.             e.printStackTrace();
  92.         } finally {
  93.                 sr.sampleEnd();// jmeter 结束统计响应时间标记
  94.         }
  95.         return sr;
  96.     }

  97.     //测试结束时调用;
  98.     public void teardownTest(JavaSamplerContext arg0) {
  99.          //System.out.println(end);
  100.          //System.out.println("The cost is"+(end-start)/1000);
  101.     }
  102.    
  103.     // main只是为了调试用,最后打jar包的时候注释掉。
  104.     /*
  105.       public static void main(String[] args)
  106.       { // TODO Auto-generated method stub
  107.               for (int i =0;i<5;i++){
  108.           Arguments params = new Arguments();
  109.           params.addArgument("Ip", "192.168.1.111");//设置参数,并赋予默认值
  110.           params.addArgument("Post", "1111");//设置参数,并赋予默认值
  111.           params.addArgument("user", "test");//设置参数,并赋予默认值
  112.           params.addArgument("password", "1111");
  113.           JavaSamplerContext arg0 = new JavaSamplerContext(params);
  114.           LoginSocketTestJmeter test = new LoginSocketTestJmeter();
  115.           test.setupTest(arg0);
  116.           test.runTest(arg0);
  117.           test.teardownTest(arg0);
  118.               }
  119.       }
  120.       */
  121.      
  122. }
复制代码
5.将相关类打包成jar包放在 X:\apache-jmeter-3.0\lib\ext目录下,使用jmeter进行压测试




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2016-5-25 12:38:11 | 只看该作者
  1. package com.test;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;
  7. import net.sf.json.JSONObject;
  8. import org.apache.mina.core.buffer.IoBuffer;
  9. //这两个加密加压的包根据项目修改
  10. import com.tools.Des3;
  11. import com.tools.ZLibUtils;

  12. /**socket 发送消息,和接收消息 测试脚本
  13. * @author Administrator
  14. *
  15. */
  16. public class LoginSocketTest {
  17.         public static void main(String[] args) throws Exception {
  18.                 try {
  19.                         //1.创建客户端Socket,指定服务器地址和端口
  20.                         Socket socket=new Socket("192.168.1.1", 11111);
  21.                         //2.获取输出流,向服务器端发送信息
  22.                         OutputStream os=socket.getOutputStream();//字节输出流
  23.                         //PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
  24.                        
  25.                         String json = "{\"test\":0,\"data\":{\"user\":\"test\",\"password\":\"test\"},\"key\":\"0\"}";
  26.                         //将json转成16进制的字节流
  27.                         os.write(getSendHex(json));
  28.                         //发送
  29.                         os.flush();
  30.                         //socket.shutdownOutput();//关闭输出流
  31.                        
  32.                         //3.获取输入流,并读取服务器端的响应信息
  33.                         InputStream is=socket.getInputStream();             
  34.                         //将接收的字节流转成json
  35.                         String recjson = getReceiveJson(is);
  36.                         //判断结果是否正确  将json转为object对象,取出要判断的参数值code做断言。
  37.       JSONObject jsonObj = JSONObject.fromObject(recjson);
  38.       String codeNum = jsonObj.get("code").toString();
  39.       System.out.println("code="+codeNum);

  40.                         //4.关闭资源
  41.                         if(os != null){  
  42.           os.close();  
  43.       }  
  44.       if(is != null){  
  45.           is.close();  
  46.       }
  47.       if(socket != null){  
  48.               socket.close();  
  49.       }
  50.                 
  51.                 } catch (UnknownHostException e) {
  52.                         e.printStackTrace();
  53.                 } catch (IOException e) {
  54.                         e.printStackTrace();
  55.                 }
  56.         }

  57.         /**
  58.          * json转为客户端发送的16进制报文
  59.          * @param json
  60.          * @return
  61.          * @throws Exception
  62.          */
  63.         public static byte[] getSendHex(String json) throws Exception {
  64.                 System.out.println("json ="+json);
  65.                 IoBuffer buff = IoBuffer.allocate(1024).setAutoExpand(true);
  66.                 //加密规则,根据项目做修改
  67.                 json = Des3.encode(json, "test");
  68.                 //加压
  69.                 byte[] bytes = ZLibUtils.compress(json.getBytes("UTF-8"));
  70.                 //装bytes存入buff
  71.                 buff.putInt(bytes.length);
  72.                 buff.put(bytes);
  73.                 buff.flip();
  74.                 // 将buff转为 字节 再转为16进制
  75.                 byte[] b = new byte[buff.limit()];
  76.                 buff.get(b);
  77.                 return b;
  78.         }

  79.         /**
  80.          * byte数组转换成16进制字符串
  81.          *
  82.          * @param src
  83.          * @return
  84.          */
  85.         public static String bytesToHexString(byte[] src) {
  86.                 StringBuilder stringBuilder = new StringBuilder();
  87.                 if (src == null || src.length <= 0) {
  88.                         return null;
  89.                 }
  90.                 for (int i = 0; i < src.length; i++) {
  91.                         int v = src[i] & 0xFF;
  92.                         String hv = Integer.toHexString(v);
  93.                         if (hv.length() < 2) {
  94.                                 stringBuilder.append(0);
  95.                         }
  96.                         stringBuilder.append(hv);
  97.                         stringBuilder.append("\\x");
  98.                 }
  99.                 //16进制前面要加\x
  100.                 return ("\\x"+stringBuilder.substring(0,stringBuilder.length()-2)).toString();
  101.         }
  102.        
  103.     /**
  104.      * 字节流转int型   
  105.      * @param b
  106.      * @return
  107.      */
  108.     public static int b2i(byte[] b) {  
  109.         int value = 0;  
  110.         for (int i = 0; i < 4; i++) {  
  111.         int shift = (4 - 1 - i) * 8;  
  112.         value += (b[i] & 0x000000FF) << shift;  
  113.         }  
  114.         return value;  
  115.     }


  116.     /**客户端得接收服务端返回的iobuffer并转成json
  117.      * 接收的iobuffer,前四个字节是表示字节流的长度,先接收前四个字节,并用16进制转10进制int型方法,得到长度的数字
  118.      * 再根据长度接收所有的字节流。如果长度错误,拨收是会出错的。
  119.      * @param is socket的输入流
  120.      * @return json
  121.      * @throws Exception
  122.      */
  123.     public static String getReceiveJson(InputStream is) throws Exception{
  124.             byte[] intByte = new byte[4];  
  125.         is.read(intByte);  
  126.         int msgLength = b2i(intByte);  
  127.         System.out.println("int:"+msgLength);  
  128.         int readPosition = 0;  
  129.         byte[] byteArray = new byte[msgLength];  
  130.         while(readPosition < msgLength){  
  131.             int value = is.read(byteArray, readPosition, msgLength-readPosition);  
  132.             if(value == -1){  
  133.                 break;  
  134.             }  
  135.             readPosition += value;  
  136.         }  
  137.                 byte[] data = ZLibUtils.decompress(byteArray); //解压
  138.                 String code = new String(data, "UTF-8");
  139.                 String text = Des3.decode(code, "test");        //解密
  140.                 System.out.println("服务端接收消息内容为:="+text);
  141.                 return text;
  142.            
  143.     }
  144. }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2016-6-27 11:30:36 | 只看该作者
上一步是做什么的?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-6 01:40 , Processed in 0.066464 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表