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
相关产品推荐
相关产品推荐

