一、前言

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

如果是可以用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.9\lib\ext,然后重新启动Jmeter啊,新建java请求,就可以看到你刚刚写的java类啦,填写上相关的参数就可以啦。

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

Jmeter自定义编写Java代码调用socket通信的更多相关文章

  1. 如何更规范化编写Java 代码

    如何更规范化编写Java 代码 Many of the happiest people are those who own the least. But are we really so happy ...

  2. 如何更规范化的编写JAVA 代码

    如何更规范的编写JAVA代码 一.MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失, ...

  3. 像写C#一样编写java代码

    JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了. 愿编写java代码的过程 ...

  4. Java代码调用服务器上的Shell脚本

    Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...

  5. 【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。

    Eclipse中导入外部jar包 在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可. 工具/原料 Eclipse 需要 ...

  6. Java代码调用Oracle的存储过程,存储函数和包

    Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名  月薪 职位 create or ...

  7. java代码调用数据库存储过程

    由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatemen ...

  8. Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

    本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...

  9. 通过编写Java代码让Jvm崩溃

    在书上看到一个作者提出一个问题"怎样通过编写Java代码让Jvm崩溃",我看了之后也不懂.带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 pu ...

随机推荐

  1. Docker 入门 第一部分: 定位和设置

    目录 Docker 入门 第一部分: 定位和设置 Docker概念 镜像和容器 容器和虚拟机 准备你的Docker环境 测试 Docker 的版本 测试 Docker 安装 回顾 总结 Docker ...

  2. alloffthelights使用方法

    官网上的demo没有用,因为官网用的jquery是谷歌的CDN,download下来的demo也没有用,因为demo的路径下少了jquery.所以自己写demo的时候要把jquery和alloffth ...

  3. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  4. 史上最全的浏览器 CSS & JS Hack 手册

    浏览器渲染页面的方式各不相同,甚至同一浏览器的不同版本(“杰出代表”是 IE)也有差异.因此,浏览器兼容成为前端开发人员的必备技能.如果有一份浏览器 Hack 手册,那查询起来就方便多了.这篇文章就向 ...

  5. 使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,则必须为UITableViewCell注册(填写)重用标识符:identifier.必须要代码方法中的标识符一致.

    CHENYILONG Blog 使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,则必须为UI ...

  6. 第9月第16天 tolua++ cocos2dx cocos2d-lua

    1. http://www.jianshu.com/p/1cdfc60da04f 2.lua c++ Lua访问C++类 现在,我们在Lua里面操作这个Student类.注意,我们绑定的每一个函数都需 ...

  7. google浏览器测试时清理缓存、强制不用缓存刷新快捷键(常用、效率)

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键  Ctrl+Shift+R  重新加载当前网页而不使用缓存内容

  8. 记关于webpack4下css提取打包去重复的那些事

    注意使用vue-cli3(webpack4),默认小于30k不会抽取为公共文件,包括css和js,已测试 经过2天的填坑,现在终于有点成果 环境webpack4.6 + html-webpack-pl ...

  9. spring事务详解(二)实例

    在Spring中,事务有两种实现方式: 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制.spring推荐使用TransactionTemplate,典型的模板模式. 申明式事务管 ...

  10. linux服务器如何添加sudo用户

    1. 编辑 vi /etc/ssh/sshd_config 文件,修改默认端口:默认Port为22,并且已经注释掉了,修改是把注释去掉,并修改成其它的端口. 原来用默认端口:22修改为:8975 (这 ...