我现在完全迷失了,所以任何见解将不胜感激......
我正在维护使用 Express 创建安全 WebSocket 的代码。原始的 socket.io 库是 v1,我已将其与节点 20.10(从 14.7 开始)一起更新为 v4。
问题是我无法让安全的 websocket 连接正常工作——客户端只是返回连接失败。客户端确实在端口 443 上成功连接到 secure Express 服务器以接收 websocket 连接端口信息。端口测试器确认套接字端口 4321 已打开。 使用带有连接字符串的在线套接字测试器连接到套接字也会失败:wss://{hostname}.com:4321/socket.io/?EIO=4&transport=websocket' 基于此,我必须相信我的客户端代码与该问题无关。但我想不出服务器设置可能有什么问题......它是否与 CORS 有关?与它是 Azure VM 有某种关系吗?
我希望这是显而易见的,因为它是一个很大的代码库。我仍然可以运行旧服务器,并且安全连接仍然可以使用相同的证书进行工作。当旧代码与 EIO=3 连接时,新代码尝试与 EIO=4 连接。
这就是我认为相关代码可能是:
节点模块: "socket.io": "^4.7.2", “socket.io-client”:“^4.7.2”,
服务器:
import { Server, Socket } from 'socket.io';
...
io = new Server(createServer(SSL.Credentials, app));
io.listen(port); // port = 4321
客户:
import { io, Socket } from 'socket.io-client';
...
_socket = io(`wss://${hostname}:4321`,
{
transports: ['websocket'],
rejectUnauthorized: false
});
运行时客户端错误是:
websocket.js:43 WebSocket connection to 'wss://{hostname}.com:4321/socket.io/?EIO=4&transport=websocket' failed:
doOpen @ websocket.js:43
open @ transport.js:46
open @ socket.js:170
Socket @ socket.js:111
open @ manager.js:108
Manager @ manager.js:39
lookup @ index.js:29
init @ DocServer.ts:192
我尝试使用 EIO=3 进行连接,但不知道如何做到这一点。我还尝试仅恢复网络代码,但由于其他软件包升级问题而没有成功。
好吧,明白了。服务器代码需要更改为:
const httpsServer = createServer(SSL.Credentials);
io = new Server(httpsServer, {})
httpsServer.listen(resolvedPorts.socket);