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

Node.js调用sock.end时出现EPROTO错误,求解决方案

Node.js TCP服务器与HTTPS请求不兼容的错误解决及替代方案

错误根源

你用net.createServer创建的是普通TCP字节流服务器,但调用https.get发起的是HTTPS请求——HTTPS是基于SSL/TLS加密的HTTP协议,TCP服务器完全不懂SSL握手规则,直接返回的"Hello world"会被HTTPS客户端判定为非法的SSL协议数据,这就是报错EPROTO wrong version number的原因。

解决方法

方案1:将HTTPS客户端改为TCP客户端

既然服务器是TCP类型,就用TCP客户端连接它,不要用HTTPS请求:

var net = require('net');

var srv = net.createServer(function(sock) {
  sock.end('Hello world\n');
});
srv.listen(0, function() {
  const port = srv.address().port;
  console.log('Listening on port ' + port);
  
  // 用net.connect发起TCP连接
  const client = net.connect(port, 'localhost', () => {
    console.log('客户端已连接到服务器');
  });
  
  // 接收服务器返回的数据
  client.on('data', (data) => {
    console.log('服务器响应:', data.toString());
    client.end(); // 关闭客户端连接
  });
  
  // 捕获客户端错误
  client.on('error', (err) => {
    console.error('客户端连接错误:', err);
  });
});

方案2:用HTTP服务器替代TCP服务器(更简单)

如果只是要实现一个返回"Hello world"的服务器并测试调用,直接用Node.js内置的http模块即可,无需手动操作底层socket:

const http = require('http');

// 创建HTTP服务器
const server = http.createServer((req, res) => {
  res.end('Hello world\n');
});

server.listen(0, () => {
  const port = server.address().port;
  console.log('HTTP Server listening on port ' + port);
  
  // 用http.get请求服务器
  http.get(`http://localhost:${port}`, (res) => {
    let responseData = '';
    res.on('data', (chunk) => {
      responseData += chunk;
    });
    res.on('end', () => {
      console.log('收到服务器响应:', responseData);
      server.close(); // 请求完成后关闭服务器
    });
  }).on('error', (err) => {
    console.error('请求错误:', err);
    server.close();
  });
});

方案3:如果需要HTTPS服务器

如果必须用HTTPS(加密传输),需要生成SSL证书(本地测试用自签名证书即可),然后用https模块创建服务器:

const https = require('https');
const fs = require('fs');

// 配置SSL证书(需提前生成server.key和server.cert)
const sslOptions = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.cert')
};

// 创建HTTPS服务器
const server = https.createServer(sslOptions, (req, res) => {
  res.end('Hello world\n');
});

server.listen(0, () => {
  const port = server.address().port;
  console.log('HTTPS Server listening on port ' + port);
  
  // 自签名证书需关闭证书验证
  https.get(`https://localhost:${port}`, { rejectUnauthorized: false }, (res) => {
    let responseData = '';
    res.on('data', (chunk) => {
      responseData += chunk;
    });
    res.on('end', () => {
      console.log('收到HTTPS响应:', responseData);
      server.close();
    });
  }).on('error', (err) => {
    console.error('HTTPS请求错误:', err);
    server.close();
  });
});

注:自签名证书可以用openssl命令生成:

openssl req -nodes -new -x509 -keyout server.key -out server.cert

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:35:20