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

能否用JMeter TCP采样器保持Socket连接持续测试?求解决方案

JMeter实现TCP长连接性能测试方案

一、JMeter原生配置实现长连接

你之前遇到的每次请求后关闭Socket的问题,是因为TCP采样器默认开启了"Close connection"选项,调整配置即可实现长连接:

  • 打开TCP采样器,将Close connection设置为false,线程会保持Socket连接不关闭。
  • 线程组配置:设置线程数为700,循环次数根据需求设置(1小时内每5分钟发送一次,共12次,循环次数设为12;若需持续检测断开,可设为无限并配合测试时长控制器)。
  • 添加Constant Timer,设置延迟为300000毫秒(5分钟),控制每个线程每5分钟发送一次数据。
  • 监控连接状态:添加TCP Connection Status Listener实时查看连接存活情况;同时添加响应断言,验证每次收发的二进制数据正确性。

二、自定义脚本增强灵活性(JSR223 Sampler)

如果原生TCP采样器逻辑不够灵活,可使用JSR223 Sampler(推荐Groovy语言)手动管理Socket连接:

// 线程初始化时建立Socket连接(仅执行一次)
if (!vars.containsKey("tcpSocket")) {
    def serverAddr = "你的服务器IP"
    def serverPort = 你的端口号
    def socket = new Socket(serverAddr, serverPort)
    vars.putObject("tcpSocket", socket)
}

// 获取已建立的连接
def socket = vars.getObject("tcpSocket")

// 发送二进制数据(替换为你的实际二进制数组)
def outputStream = socket.getOutputStream()
byte[] requestData = [0x00, 0x01, 0x02] as byte[] // 示例二进制数据
outputStream.write(requestData)
outputStream.flush()

// 接收响应并验证连接状态
def inputStream = socket.getInputStream()
byte[] buffer = new byte[1024]
int readLen = inputStream.read(buffer)

if (readLen == -1) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("Socket连接已断开")
} else {
    // 处理响应二进制数据,可根据需求添加验证逻辑
}
  • 需添加JSR223 Teardown Script,在线程结束时关闭Socket避免资源泄漏:
def socket = vars.getObject("tcpSocket")
if (socket != null && !socket.isClosed()) {
    socket.close()
}

三、替代工具推荐(若JMeter无法满足需求)

如果上述方案仍无法覆盖测试场景,可考虑以下工具:

  • LoadRunner:支持TCP长连接性能测试,提供可视化脚本录制、参数化及丰富监控指标,适合复杂业务场景。
  • Gatling:基于Scala的高性能测试工具,通过代码定义测试场景,对TCP长连接并发支持优秀,适合高压力下的稳定性测试。
  • wrk2:轻量级性能测试工具,可通过Lua脚本扩展实现TCP长连接测试,配置简单,适合快速验证服务器性能。
  • SocketTest:专注于TCP/UDP协议的测试工具,支持多线程长连接模拟,适合初期验证服务器连接保持能力及数据收发正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:55:20