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

JMeter TCP采样器连接无法关闭及请求阻塞问题求助

解决JMeter TCP采样器无法停止/超时报错的问题

结合你描述的情况,核心问题大概率是响应结束标识(EOM/EOL)配置不匹配,导致JMeter一直在等待服务器返回的结束信号,要么一直挂着停不下来,超时后就抛出ReadException报错。下面给你一步步的排查和解决建议:

1. 从Wireshark抓包中确认响应的结束规则

既然你已经抓了包,一定要仔细分析服务器返回的响应格式:

  • 检查每条响应的末尾是否有固定的结束字节(比如特定的十六进制值,比如0x1C、0x00等),把这个值转换成十进制,就是你需要设置的EOM/EOL值。
  • 如果响应是固定长度的(比如每条响应都是122字节,和你报错里的Body size一致),那BinaryTCPClientImpl可能不适用,建议换成LengthPrefixedBinaryTCPClientImpl,并根据抓包中的长度前缀格式配置前缀字节数(比如2字节、4字节)。

2. 正确配置连接复用

你需要复用第一条连接发送后三条数据,那绝对不能勾选Close connection复选框——勾选这个选项后,JMeter会在每次采样完成后主动关闭连接,后面的请求就会重新建立新连接,完全不符合你的复用需求。JMeter默认是开启连接复用的,只要不勾选Close connection,后续采样会自动复用之前的连接。

3. 精准设置结束符(EOM/EOL)

方法一:通过JMeter UI设置

在TCP采样器的EOL字段中输入十进制的结束字节值(注意不是十六进制),比如抓包中响应末尾是十六进制0x18,就输入十进制的24。

方法二:通过配置文件设置

修改jmeter.properties中的tcp.BinaryTCPClient.eomByte参数,同样填入十进制的结束字节值,修改后需要重启JMeter才能生效。

注意:如果你试了很多值都不对,可能服务器的响应并没有固定结束符,而是需要根据内容判断(比如特定的响应头或内容标记),这种情况可能需要你自定义一个TCPClient实现类,或者用脚本(比如JSR223 Sampler)来处理TCP通信。

4. 排查超时报错的根源

你设置超时后出现的500 ReadException,本质还是JMeter在超时时间内没收到符合结束规则的完整响应,一直在等待。所以解决结束符的问题后,这个报错自然会消失。

5. 调试辅助技巧

  • 添加View Results Tree监听器,查看采样器发送的二进制数据和接收的响应数据,对比Wireshark抓包,确认JMeter是否收到了完整的响应,是不是差了结束字节。
  • 可以临时尝试RawTCPClientImpl(在TCP采样器的TCPClient classname中选择),这个实现会一直读取数据直到连接关闭,但只适合服务器会主动关闭连接的短连接场景,如果服务器保持长连接,它还是会挂着,所以仅用于调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:04:16