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

使用现有TLS套接字发送HTTP/2请求至m.twitch.tv时遇ECONNRESET错误

问题分析与解决方案

核心问题原因

你遇到的ECONNRESET错误是因为Twitch服务器在TLS握手阶段主动断开了连接,主要有两个关键因素:

  1. 手动创建的TCP Socket未完成连接就启动TLS握手:net.connect是异步操作,直接将未就绪的socket传给tls.connect会导致TLS握手时机过早,Twitch服务器拒绝了不规范的握手请求。
  2. 缺少必要的错误监听:未处理socket、TLS连接、HTTP/2客户端的错误事件,导致程序因未捕获的错误直接崩溃,无法获取更多调试信息。

具体修复步骤

1. 为所有网络对象添加错误监听

给socket、tlsConn、HTTP/2客户端和请求添加错误监听,避免程序崩溃同时捕获详细错误信息:

socket.on('error', (err) => console.error('TCP Socket Error:', err));
tlsConn.on('error', (err) => console.error('TLS Connection Error:', err));
// 后续创建client和request时也添加对应error监听

2. 等待TCP Socket连接完成后再初始化TLS连接

不要直接将socket传入tls.connect的配置项,而是等待socket的connect事件触发后,再创建TLS连接:

const socket = net.connect(port, host);
socket.on('connect', () => {
  const tlsOptions = {
    ALPNProtocols: ["h2"],
    servername: host,
    socket: socket,
  };
  const tlsConn = tls.connect(tlsOptions);
  
  // 后续的secureConnect逻辑移到此处
});

3. 优化HTTP/2请求的收尾逻辑

在request的data事件中直接关闭客户端可能导致数据未完全接收,建议监听end事件再关闭:

request.on("data", data => {
  console.log(data.toString());
});
request.on("end", () => {
  console.log("\nResponse status: " + responseCode);
  client.close();
});

4. 确保TLS配置兼容Twitch要求

Twitch服务器对TLS版本有严格要求,可显式指定版本范围:

const tlsOptions = {
  ALPNProtocols: ["h2"],
  servername: host,
  socket: socket,
  minVersion: 'TLSv1.2',
  maxVersion: 'TLSv1.3',
};

完整修复后的代码

// Usage: node file.js m.twitch.tv 443
const net = require("net");
const tls = require("tls");
const http2 = require("http2");

const host = process.argv[2];
const port = ~~process.argv[3];

const headers = {
  ":authority": host,
  ":method": "GET",
  ":path": "/",
  ":scheme": "https",
  "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
  "accept-language": "en-US,en;q=0.9",
  "dnt": "1",
  "sec-ch-ua": '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"',
  "sec-ch-ua-mobile": "?0",
  "sec-ch-ua-platform": '"Windows"',
  "sec-fetch-dest": "document",
  "sec-fetch-mode": "navigate",
  "sec-fetch-site": "none",
  "sec-fetch-user": "?1",
  "upgrade-insecure-requests": "1",
  "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.7.7895.91 Safari/537.36"
};

const socket = net.connect(port, host);

// TCP Socket错误监听
socket.on('error', (err) => console.error('TCP Socket Error:', err));

socket.on('connect', () => {
  const tlsOptions = {
    ALPNProtocols: ["h2"],
    servername: host,
    socket: socket,
    minVersion: 'TLSv1.2',
    maxVersion: 'TLSv1.3',
  };

  const tlsConn = tls.connect(tlsOptions);

  // TLS连接错误监听
  tlsConn.on('error', (err) => console.error('TLS Connection Error:', err));

  tlsConn.on("secureConnect", () => {
    const client = http2.connect(`https://${host}`, {
      createConnection: () => tlsConn
    });

    // HTTP/2客户端错误监听
    client.on('error', (err) => console.error('HTTP/2 Client Error:', err));

    client.on("connect", () => {
      let responseCode = 0;
      const request = client.request(headers);

      // 请求错误监听
      request.on('error', (err) => console.error('Request Error:', err));

      request.on("response", response => {
        responseCode = response[":status"];
      });

      request.on("data", data => {
        console.log(data.toString());
      });

      request.on("end", () => {
        console.log("\nResponse status: " + responseCode);
        client.close();
      });

      // 结束请求,告知服务器不再发送数据
      request.end();
    });
  });
});

额外说明

  • Twitch的反爬机制可能会检测请求完整性,确保所有请求头格式正确(比如引号转义),你的现有头信息已符合要求无需修改。
  • 如果仍出现问题,可以尝试更换为最新版本的Chrome/Firefox User-Agent,或者添加从浏览器获取的有效Twitch cookie头。

内容的提问来源于stack exchange,提问作者Bảo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:42:01