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

JMeter TCP Sampler获取响应后测试未自动停止且报500错误如何解决

JMeter TCP Sampler 响应不停止+500错误解决方案

问题根因

TCP Sampler默认以配置的end of line字节作为响应结束的判断标识,若服务端返回的响应未携带该结束字节,Sampler会持续等待响应结束,直到超时或手动终止,同时因未读到预期结束标记判定请求失败,返回500错误。

方案一:修复TCP Sampler配置(优先推荐,无需编码)

  • 首先纠正无效配置:end of line为单字节的十进制值,取值范围0-255,你之前设置的1200、1300为无效值,不会生效。
  • 先通过Wireshark抓包确认服务端响应的结束规则,再匹配对应的TCPClient实现类:
    1. 若响应开头带有固定长度字段标识总报文长度:将TCP Sampler的「TCPClient classname」设置为org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl,同步在jmeter.properties中配置tcp.length.prefix.length为长度字段的字节数(默认值为2,按需修改即可)。
    2. 若响应长度固定:将「TCPClient classname」设置为org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl,同步在jmeter.properties中配置tcp.binary.length为响应的固定字节数。
    3. 若服务端发送完响应后主动断开连接、无单独结束标记:将tcp.eolByte设置为-1,Sampler会在检测到连接断开时自动判定响应结束,无需等待结束标记。
  • 注意:你之前在请求末尾添加\0、\r\n是用于服务端识别请求结束的配置,和响应读取逻辑无关;勾选「close connection」仅控制请求发送完成后是否关闭连接,不影响响应读取逻辑。

方案二:JSR223 Sampler实现TCP请求

若以上配置均不匹配你的业务场景,可直接使用以下Groovy代码实现TCP请求,无需额外依赖,直接粘贴到JSR223 Sampler中,选择语言为Groovy,修改前置配置项即可使用:

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

// ********** 自定义配置项 按需修改 **********
def serverHost = "你的服务端IP"
def serverPort = 你的服务端端口 // 注意不要加引号,比如8080
def requestContent = "你要发送的文本内容"
def charset = "UTF-8" // 和服务端字符编码保持一致
def timeout = 5000 // 超时时间,单位毫秒
// ****************************************

Socket socket = null
OutputStream out = null
InputStream inp = null
try {
    // 建立TCP连接
    socket = new Socket(serverHost, serverPort)
    socket.setSoTimeout(timeout)

    // 发送请求
    out = socket.getOutputStream()
    out.write(requestContent.getBytes(charset))
    out.flush()

    // 读取响应(默认读到连接断开为止,若有自定义结束规则可自行修改读取逻辑)
    inp = socket.getInputStream()
    def buffer = new ByteArrayOutputStream()
    byte[] buf = new byte[1024]
    int len
    while ((len = inp.read(buf)) != -1) {
        buffer.write(buf, 0, len)
    }
    def response = buffer.toString(charset)

    // 写入JMeter结果
    SampleResult.setResponseData(response, charset)
    SampleResult.setSuccessful(true)
    SampleResult.setResponseCodeOK()
} catch (Exception e) {
    // 异常处理
    SampleResult.setSuccessful(false)
    SampleResult.setResponseCode("500")
    SampleResult.setResponseMessage(e.getMessage())
    e.printStackTrace()
} finally {
    // 释放资源
    if (inp != null) inp.close()
    if (out != null) out.close()
    if (socket != null) socket.close()
}

内容的提问来源于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.04 11:15:01