📜  Socket.IO 无法通过 https 连接 - Javascript (1)

📅  最后修改于: 2023-12-03 14:47:30.484000             🧑  作者: Mango

Socket.IO 无法通过 https 连接 - JavaScript

如果您使用 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 文档并查看日志以获取更多信息。