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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:09:02