jmeter的java请求(socket接口)

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请求

  1. 需要基础jar包:ApacheJMeter_core.jar,ApacheJMeter_java.jar.能够让你的代码在jmeter中运行起来
  2. 编写的类需要继承AbstractJavaSamplerClient,并重写该类的方法.jmeter会自动执行该类的重写方法
  3. 在重新方法中编写发送socket请求的内容

2.jmeter如何使用编写的java请求

  1. 导出编写的java代码为jar包;
  2. 将此jar包放入JMETER_HOME\lib\ext目录;
  3. 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的请求参数格式需要.特别注意,需要什么样的格式拼接什么样的格式

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值