JMeter发送TCP消息测试遇响应无结束标识问题及服务端配置问询
服务端相关对应配置项
- 响应结束标识追加配置:多数TCP服务支持配置在响应报文末尾追加统一的结束分隔符(例如
\n、\r\n或自定义业务标识),默认状态下该配置通常为关闭,无结束符时客户端无法判断响应是否传输完成。 - 响应长度声明配置:针对固定/可变长度报文场景,服务端可配置在响应报文头部追加明确的总字节数字段,客户端可按照字段指定的长度读取响应,读完即停止。
- 短连接主动断连配置:你使用的是接收请求后就关闭的短连接服务,需确认服务端是否配置了「响应发送完成后立即主动触发FIN断开TCP连接」的规则,若服务端默认等待客户端主动断连,会导致连接一直处于空闲挂起状态。
- 空闲连接超时配置:若服务端配置的空闲连接自动断开阈值远大于JMeter侧设置的超时时间,也会导致JMeter持续等待响应,触发读取异常。
面向非技术人员的阻塞问题解释
这个问题的逻辑和打电话问问题的场景完全一致:你打给对方问问题,对方回答完之后既不说「我说完了」,也不主动挂电话,你就只能一直拿着电话等,不知道对方是不是还有后续内容要讲,直到你等得不耐烦自己主动挂电话,系统就会报读取错误。而且卡在等待状态的时候,你没法打新的电话,就会出现所有请求都失败的情况。
可行解决方案
服务端侧最优方案
优先调整上述服务端配置,根据业务场景选择任意一种即可解决问题:
- 给所有响应追加统一的结束分隔符
- 固定响应长度,或在响应头中添加报文总长度字段
- 开启短连接场景下响应发送完成后主动断开连接的规则
JMeter侧临时适配方案
如果暂时无法调整服务端配置,可通过JMeter侧配置适配:
- 固定长度报文场景:将TCP采样器的
TCPClient classname设置为org.apache.jmeter.protocol.tcp.sampler.FixedLengthTCPClientImpl,同时配置正确的响应固定字节长度,JMeter读完指定长度后会自动停止读取。 - 可变长度报文场景:在TCP采样器的「超时(毫秒)」字段填写大于正常响应时间2-3倍的阈值,也可基于业务逻辑自定义TCPClientImpl实现类,通过报文中的业务字段判断响应是否结束。
- 之前设置行尾值未生效的原因是服务端没有返回对应的结束符,该配置需要和服务端返回的结束符匹配才会生效。
内容的提问来源于stack exchange,提问作者usama ibrahim
相关产品推荐
相关产品推荐

