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实现类:
- 若响应开头带有固定长度字段标识总报文长度:将TCP Sampler的「TCPClient classname」设置为
org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl,同步在jmeter.properties中配置tcp.length.prefix.length为长度字段的字节数(默认值为2,按需修改即可)。 - 若响应长度固定:将「TCPClient classname」设置为
org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl,同步在jmeter.properties中配置tcp.binary.length为响应的固定字节数。 - 若服务端发送完响应后主动断开连接、无单独结束标记:将
tcp.eolByte设置为-1,Sampler会在检测到连接断开时自动判定响应结束,无需等待结束标记。
- 若响应开头带有固定长度字段标识总报文长度:将TCP Sampler的「TCPClient classname」设置为
- 注意:你之前在请求末尾添加
\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
相关产品推荐
相关产品推荐

