📅  最后修改于: 2023-12-03 14:47:30.484000             🧑  作者: Mango
如果您使用 Socket.IO 添加 WebSocket 功能,但框架在 https 上不起作用,可能是由于浏览器的安全限制引起的。这篇文章将介绍如何解决这个问题。
Socket.IO 的默认传输方式是 WebSocket,但浏览器在 https 协议下通常会拦截非加密的 WebSocket 请求。因此,在使用 Socket.IO 时,您需要将应用程序部署到 https,并使用安全传输方式。否则,Socket.IO 将无法连接到服务器。
当您在浏览器中使用 http 协议启动 Socket.IO 客户端时,您将看到以下错误:
WebSocket connection to 'ws://localhost:3000/socket.io/?EIO=3&transport=websocket' failed:
Error in connection establishment: net::ERR_CONNECTION_REFUSED
要解决这个问题,您需要在自己的应用程序中启用 HTTPS。这可以通过许多方式完成,例如在 nginx 或 Apache 中设置 SSL 证书。在使用 Node.js 时,您可以使用 https
模块启用 HTTPS。
const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();
const serverOptions = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
};
const server = https.createServer(serverOptions, (req, res) => {
res.writeHead(200);
res.end('Hello World!');
});
server.listen(3000);
启动 HTTPS 服务器后,您需要更新 Socket.IO 客户端连接的 URL。将 http
替换为 https
并使用正确的端口号。例如:
const socket = io.connect('https://localhost:3000');
这样,当应用程序通过 https 访问时,您将不会遇到与 Socket.IO 和 WebSocket 相关的问题。
通过使用 HTTPS 协议启用应用程序,您可以解决使用 Socket.IO 无法连接 WebSockets 的问题。记得在客户端代码中使用正确的 URL 访问您的服务器。
如果您仍然遇到连接问题,请参阅 Socket.IO 文档并查看日志以获取更多信息。