socket简介:网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
背景介绍:socket接口在jmeter中很难模拟,但是如果socket接口使用java编写,导出jar包,然后在jmeter中添加java请求,就可以对socket请求做相应的压测或者接口测试.
1.eclipse中编写socket请求
- 需要基础jar包:ApacheJMeter_core.jar,ApacheJMeter_java.jar.能够让你的代码在jmeter中运行起来
- 编写的类需要继承AbstractJavaSamplerClient,并重写该类的方法.jmeter会自动执行该类的重写方法
- 在重新方法中编写发送socket请求的内容
2.jmeter如何使用编写的java请求
- 导出编写的java代码为jar包;
- 将此jar包放入JMETER_HOME\lib\ext目录;
- jmeter中创建线程组、Java Request,在java请求中可以选择到咱们编写的类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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 AdvanceRecondTest extends AbstractJavaSamplerClient {
/**
* 设置jmeter界面参数
*/
public Arguments getDefaultParameters() {
// 定义一个参数,显示到Jmeter的参数列表中,第一个参数为参数默认的显示名称key,第二个参数为默认值value
Arguments arguments = new Arguments();
arguments.addArgument("requestId", "123456");
return arguments;
}
// 初始化方法,用于初始化性能测试时的每个线程.
public void setupTest(JavaSamplerContext context) {
}
/**
* 将jmeter界面上的参数保存
*
* @param context
* jmeter界面参数
* @return 参数串
* @throws Exception
*/
public String getRequestValue(JavaSamplerContext context) throws Exception {
// 获取界面中传递的值,根据key获取value
String requestId = context.getParameter("requestId");
return requestId;
}
/**
* 向服务器发送请求并接收响应结果
*
* @param context
* 请求参数
* @return 响应结果
*/
@SuppressWarnings({ "unused", "resource" })
public String sendRequest(String context) {
Socket socket = null;
InputStream iStream = null;
InputStreamReader inputStreamReader = null;
OutputStream outputStream = null;
BufferedReader bReader = null;
String returnInfo = null;
try {
// 1.建立socket连接
getLogger().info("开始建立socket连接");
socket = new Socket(ip, Integer.valueOf(port));
iStream = socket.getInputStream();
inputStreamReader = new InputStreamReader(iStream, "UTF-8");
getLogger().info("获取客户端的输出流");
outputStream = socket.getOutputStream();
getLogger().info("向服务器发送消息:" + context);
// 2.向服务器端发送消息
outputStream.write(context.getBytes());
outputStream.flush();
getLogger().info("向服务器发送消息完成");
// 4.获取输入流,并读取服务器端的响应信息
bReader = new BufferedReader(inputStreamReader);
returnInfo = bReader.readLine();
getLogger().info("响应数据:" + returnInfo);
} catch (Exception e) {
e.printStackTrace();
} finally {
getLogger().info("关闭资源");
try {
bReader.close();
outputStream.close();
inputStreamReader.close();
iStream.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return returnInfo;
}
// 性能测试时的线程运行体
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sampleResult = new SampleResult();
sampleResult.setDataEncoding("UTF-8");
sampleResult.setContentType("UTF-8");
sampleResult.setSampleLabel("支取");
try {
// 事务开始标志
sampleResult.sampleStart();
// 获取请求参数
String requesetParams = getRequestValue(context);
// 建立连接发送请求参数,得到返回结果
String returnInfo = sendRequest(requesetParams);
if (requesetParams.contains("E0003")) {
sampleResult.setDataType(SampleResult.TEXT);
sampleResult.setSuccessful(true);
// 设置在jmeter页面显示的响应信息
sampleResult.setResponseData("result:" + returnInfo, null);
// 将响应信息回显到取样器中
sampleResult.setResponseMessage(returnInfo);
getLogger().info(returnInfo);
} else {
sampleResult.setDataType(SampleResult.TEXT);
sampleResult.setSuccessful(false);
// 设置在jmeter页面显示的响应信息
sampleResult.setResponseData("result:" + returnInfo, null);
// 将响应信息回显到取样器中
sampleResult.setResponseMessage(returnInfo);
getLogger().info(returnInfo);
}
} catch (Exception e) {
e.printStackTrace();
sampleResult.setSuccessful(false);
} finally {
sampleResult.sampleEnd();
}
return sampleResult;
}
}
然后就可以看到响应结果了
注:socket的请求参数格式需要.特别注意,需要什么样的格式拼接什么样的格式