【发布时间】:2018-01-30 00:29:59
【问题描述】:
我正在尝试让 2 个服务器通过 socket.io 库和 SSL 进行通信。
这在升级socket.io 软件包之前一直有效(不能告诉你是哪个)。
我已设法修复与浏览器的安全连接。我还让它在不安全的(http)服务器之间工作。但是安全(https)服务器拒绝在它们之间进行连接。您可能会争辩说socket.io 不是为服务器到服务器通信而设计的,但它可以为我节省大量的修复工作。
我现在正在跑步:
node: 7.5.0
express: 4.16.2
socket.io (and socket.io-client): 2.0.3
我什至无法在下面制作简单的示例(删除我所有的中间件)。
节点服务器
// Use SSL certificate
const cert_path = "..";
const fs = require('fs');
const https_options = {
key: fs.readFileSync(cert_path+'/privkey.pem'),
cert: fs.readFileSync(cert_path+'/cert.pem')
};
const app = require('express')();
const https = require('https');
const server = https.createServer(https_options, app);
const io = require('socket.io')(server);
server.listen(8000);
io.on('connection', function (socket) {
console.log("connected");
});
节点客户端
const io = require('socket.io-client');
const socket = io.connect(
'https://localhost:8000',
{secure: true}
);
socket.on("connect", function () {
console.log("connected");
});
什么都没有发生,它们都没有连接。知道为什么吗?
编辑:connect_error 和 reconnect_error 在客户端每 5 秒弹出一次:
{ Error: xhr poll error
at XHR.Transport.onError (../node_modules/engine.io-client/lib/transport.js:64:13)
at Request.<anonymous> (../node_modules/engine.io-client/lib/transports/polling-xhr.js:128:10)
at Request.Emitter.emit (../node_modules/component-emitter/index.js:133:20)
at Request.onError (../node_modules/engine.io-client/lib/transports/polling-xhr.js:310:8)
at Timeout._onTimeout (../node_modules/engine.io-client/lib/transports/polling-xhr.js:257:18)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }
进一步挖掘错误,我发现它可能来自证书。但是,当我应用 SO 的几种解决方法时,我连续得到 ECONNREFUSED、UNABLE_TO_VERIFY_LEAF_SIGNATURE,最后是 DEPTH_ZERO_SELF_SIGNED_CERT...
【问题讨论】:
-
您是否确认同步加载凭据所用的时间不超过加载服务器所需的时间?如果这是一个问题,那么您可以考虑使用
fs.readFile(异步版本)或只使用dotenv的环境变量,并完全避免同步或异步操作。 -
阅读正常,不是问题。它在向网页提供
wss时有效。 -
您是否尝试过在客户端的错误事件中添加监听器?我没有使用 socket.io 的经验,但快速查看 API 文档,我发现:socket.io/docs/client-api/#event-connect_error.
-
好主意:我收到了 reconnect_error。我用这个编辑。
-
你有
socket.io和socket.io-client的匹配版本吗?在 socket.io 的最新主要版本中,客户端不再与旧服务器兼容,反之亦然。