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

JMeter中使用JSR223发送TCP请求并获取响应的方法咨询

完整实现代码

import java.net.Socket
import java.net.InetSocketAddress
import java.io.ByteArrayOutputStream

def sock = new Socket()
def host = "myIPNumber" // 替换为目标服务IP
def port = 1234 // 替换为目标服务端口
def timeout = 10000 // 超时时间,单位毫秒
// 替换为你要发送的请求内容
def requestContent = "自定义TCP请求内容"
// 替换为业务约定的编码格式,比如GBK、ISO-8859-1等
def charset = "UTF-8"

try {
    sock.setSoTimeout(timeout)
    sock.connect(new InetSocketAddress(host, port), timeout)
    
    if (sock.isConnected()) {
        log.info('TCP连接建立成功')
        // 发送请求数据
        def out = sock.getOutputStream()
        out.write(requestContent.getBytes(charset))
        out.flush()
        
        // 读取响应数据
        def inputStream = sock.getInputStream()
        def byteArrayOutputStream = new ByteArrayOutputStream()
        def buffer = new byte[1024]
        int len
        while ((len = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, len)
        }
        def responseContent = byteArrayOutputStream.toString(charset)
        log.info("TCP服务端响应内容:${responseContent}")
        
        // 将响应存入JMeter变量,后续可通过${tcp_response}引用
        vars.put("tcp_response", responseContent)
        // 设置采样结果
        SampleResult.setSuccessful(true)
        SampleResult.setResponseData(responseContent, charset)
        SampleResult.setResponseCodeOK()
        
        // 关闭流
        out.close()
        inputStream.close()
        byteArrayOutputStream.close()
    } else {
        log.info('目标端口未监听')
        SampleResult.setSuccessful(false)
        SampleResult.setResponseMessage("目标端口未监听")
    }
} catch (Exception e) {
    log.error("TCP请求处理失败", e)
    SampleResult.setSuccessful(false)
    SampleResult.setResponseMessage("请求异常:${e.getMessage()}")
} finally {
    // 关闭Socket连接
    if (sock != null && !sock.isClosed()) {
        sock.close()
    }
}

关键逻辑说明

  • 发送TCP请求:通过Socket实例的getOutputStream()方法获取输出流,将需要发送的业务请求内容转为对应编码的字节数组后写入流,执行flush()确保数据全部发送到服务端,无残留缓存。
  • 读取响应数据:通过getInputStream()方法获取输入流读取服务端返回的字节内容,转为字符串时注意和服务端约定的编码保持一致,避免乱码。
  • 存储为JMeter变量:调用JSR223内置对象vars.put("自定义变量名", 响应内容字符串)即可完成变量存储,后续所有JMeter组件都可以通过${自定义变量名}的格式直接引用该响应值。

TCP Sampler报错原因说明

TCP Sampler依赖*结束符(EOL)*匹配判断响应是否结束,如果服务端返回的报文未携带你配置的结束标识,Sampler会持续等待直到超时;如果结束符配置和实际报文不匹配,会直接返回500错误。如果不想做额外的结束符适配,直接用JSR223自定义Socket读写的方式灵活性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:06:04