JMeter发送TCP类请求报SocketTimeoutException超时问题咨询
JMeter TCP/HTTP Raw请求超时/挂起问题排查与解决
核心原因定位
你遇到的所有报错、无限运行问题的本质都是:你使用的JMeter采样器默认需要等待服务端返回符合规则的响应后才会结束请求,但你对接的普通TCP端口、Logstash WebSocket端口不会返回符合采样器预期的响应内容,最终触发超时或者无限等待。
你用nc命令测试正常的核心差异是:nc发完数据后无需等待响应即可终止连接,和JMeter默认的收发一体逻辑完全不同。
排查步骤
- 抓包对比nc与JMeter的通信流程:确认nc发送完数据后直接发送FIN包断开连接,JMeter发送完数据后进入ACK等待状态,未收到服务端回包就会一直等待直到超时。
- 校验采样器配置逻辑:HTTP Raw Sampler默认需要读取标准HTTP格式响应,普通TCP端口不会返回该格式内容,自然触发读超时;TCP Sampler默认等待配置的结束符才会终止读操作,结束符不匹配就会超时;你写的JSR223代码中调用了
reader.readLine(),服务端没有返回带换行符的响应就会卡住直到socket超时。 - 验证HTTP请求挂起逻辑:你对问题的推测完全正确,普通HTTP采样器必须拿到符合规范的HTTP响应报文才会结束请求,Logstash的WebSocket端口收到握手请求后不会返回标准HTTP响应,因此采样器会无限挂起等待响应。
解决方案
仅需发送数据无需接收响应的场景(当前适配方案)
- 使用HTTP Raw Sampler:将「响应超时(ms)」调整为可接受的短时长,勾选「采样结束后关闭连接」选项,若版本支持可直接关闭「读取响应」开关,自定义断言将超时判定为数据发送成功的正常结果即可。
- 使用TCP Sampler:配置较短的响应超时时间,开启「忽略响应」配置,同时添加响应断言将
SocketTimeoutException标记为正常结果,只要连接成功、数据发送完成就算采样通过。 - 使用JSR223 Sampler:删除读响应的相关代码,仅保留连接、发送数据、关闭连接的逻辑即可,参考代码如下:
def client = null try { client = new Socket('DemoHostname', 9000) client.setSoTimeout(1000) def outputStream = client.getOutputStream() outputStream.write("Hello ".getBytes("UTF-8")) outputStream.flush() SampleResult.setSuccessful(true) SampleResult.setResponseMessage("数据发送成功") } catch (Exception e) { SampleResult.setSuccessful(false) SampleResult.setResponseMessage("请求失败: " + e.getMessage()) } finally { if (client != null) { client.close() } }
- 对接WebSocket端口:不要使用普通HTTP采样器,改用JMeter官方WebSocket采样器插件,配置正确的WebSocket握手和消息发送规则,即可避免无限挂起问题。
需要接收服务端响应的场景
先确认目标端口的响应规则:
- 普通TCP端口:确认响应的结束标识(如固定换行符、特殊分隔符、固定响应长度),将TCP Sampler的「结束符」配置为对应值即可正常读取响应。
- 自定义协议端口:直接通过JSR223 Sampler按照协议规则编写响应解析逻辑,不要使用
readLine()这类通用读取方法。
内容的提问来源于stack exchange,提问作者Sameera De Silva
相关产品推荐
相关产品推荐

