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
相关产品推荐
相关产品推荐

