You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter:如何从CSV读取值替换TCP Sampler变量并每10秒发送请求

JMeter实现定时TCP请求+CSV变量替换方案

一、基础实现步骤

1. 配置CSV数据文件元件

  • 创建CSV文件,列名与请求文本中的变量一一对应:packettype, msgid, pcktsts, gpsfix, lat, latdir, long, longdir, speed, head, sat, alt, pdop, hdop, network, ignsts, mpsts, mivolt, ibvoltusg, emsts, tampalt, frame, ddist, checksum,每行填入预定义的变量值,用逗号分隔。
  • 添加「CSV数据文件设置」元件,指定CSV文件路径,设置变量名为上述列名,勾选「循环读取」(按需选择是否循环),确保每次请求能读取新的一行数据。

2. 添加TCP请求取样器

  • 填入服务器IP和端口,根据服务端要求配置编码、换行符等TCP参数。
  • 在「要发送的文本」框中粘贴指定字符串:
XXXXXXX,XXXXXXX,XXXXXXXX,${packettype},${msgid},${pcktsts},${__threadGroupName},TSXXTSXXXX,${gpsfix},31082022,${__groovy(new Date().format("HHmmss", TimeZone.getTimeZone('UTC')),)},${lat},${latdir},${long},${longdir},${speed},${head},${sat},${alt},${pdop},${hdop},${network},${ignsts},${mpsts},${mivolt},${ibvoltusg},${emsts},${tampalt},31,404,86,7b73,b74a,86,02a2,7b73,49,4d0a,7d0b,49,1948,7b73,59,Ffff,0000,100000,001,${frame},0.0,0.0,${ddist},()*${checksum}

3. 设置10秒请求间隔

  • 添加「固定定时器」,设置线程延迟为10000毫秒(即10秒),确保每个TCP请求之间间隔10秒。注意定时器作用域,若为多线程场景,需确保作用于单个请求而非线程组。

4. 配置线程组

  • 根据需求设置线程数、循环次数,若需持续发送请求,将循环次数设为「永远」,手动停止测试即可。

二、更优实现方案

1. 实时生成校验和(替代CSV预定义)

如果checksum是基于请求内容计算的结果,可通过JSR223预处理程序实时生成,减少CSV维护成本。示例Groovy代码:

// 构造不含校验和的原始请求字符串
def rawRequest = "XXXXXXX,XXXXXXX,XXXXXXXX,${packettype},${msgid},${pcktsts},${__threadGroupName},TSXXTSXXXX,${gpsfix},31082022,${__groovy(new Date().format("HHmmss", TimeZone.getTimeZone('UTC')),)},${lat},${latdir},${long},${longdir},${speed},${head},${sat},${alt},${pdop},${hdop},${network},${ignsts},${mpsts},${mivolt},${ibvoltusg},${emsts},${tampalt},31,404,86,7b73,b74a,86,02a2,7b73,49,4d0a,7d0b,49,1948,7b73,59,Ffff,0000,100000,001,${frame},0.0,0.0,${ddist}"
// 示例:计算MD5校验和(根据实际算法调整)
def checksum = org.apache.commons.codec.digest.DigestUtils.md5Hex(rawRequest).toUpperCase()
vars.put("checksum", checksum)

2. 优化CSV读取逻辑

  • 勾选「CSV数据文件设置」中的「共享模式」为「所有线程」,确保多线程场景下数据不重复读取;若需每个线程独立读取,选择「当前线程」。
  • 启用「忽略首行」(若CSV首行为表头),设置「遇到文件结束符时循环」+「额外循环次数」,提升数据复用灵活性。

3. 用JSR223 Sampler实现灵活TCP交互

若需自定义TCP握手、响应处理等逻辑,直接用Groovy脚本发送请求,示例代码:

import java.net.Socket
import java.io.OutputStream

// 读取CSV变量
def packettype = vars.get("packettype")
def msgid = vars.get("msgid")
// 其他变量同理读取

// 构造完整请求字符串
def fullRequest = "XXXXXXX,XXXXXXX,XXXXXXXX,${packettype},${msgid},${pcktsts},${__threadGroupName},TSXXTSXXXX,${gpsfix},31082022,${__groovy(new Date().format("HHmmss", TimeZone.getTimeZone('UTC')),)},${lat},${latdir},${long},${longdir},${speed},${head},${sat},${alt},${pdop},${hdop},${network},${ignsts},${mpsts},${mivolt},${ibvoltusg},${emsts},${tampalt},31,404,86,7b73,b74a,86,02a2,7b73,49,4d0a,7d0b,49,1948,7b73,59,Ffff,0000,100000,001,${frame},0.0,0.0,${ddist},()*${checksum}"

// 建立TCP连接并发送数据
Socket socket = new Socket("服务器IP", 端口号)
OutputStream out = socket.getOutputStream()
out.write(fullRequest.getBytes("UTF-8"))
out.flush()

// 可选:读取并保存响应
// InputStream inStream = socket.getInputStream()
// byte[] buffer = new byte[1024]
// int len = inStream.read(buffer)
// vars.put("tcp_response", new String(buffer, 0, len, "UTF-8"))

// 关闭资源
out.close()
socket.close()

4. 调试与监控优化

  • 添加「查看结果树」「聚合报告」元件,实时监控请求成功率、响应时间。
  • 在JSR223元件中添加日志输出,方便调试:
log.info("发送的TCP请求:${fullRequest}")

内容的提问来源于stack exchange,提问作者Pranay Doshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:45:56