运行在同一个 NodeJS 进程上的 http 服务器和 websocket 服务器是否可以在本地相互通信?



我使用express和 ws 创建了一个 https 服务器和一个 websockets 服务器,它们在 Ubuntu 18.04 服务器上从相同的 Node 进程和相同的端口 (443( 运行。

我的服务器.js可以归结为:

const express = require('express');
const https = require('https');
const Websocket = require('ws');
const app = express();
app.use(/* ... Express routes */);
const credentials = /* SSL Certificate */;
const httpServer = https.createServer(credentials, app);
const wsServer = new WebSocket.Server({ server: httpServer });
wsServer.on('connection', (ws, req) => {
// Handle incoming websocket messages
});
httpServer.listen(443);

我需要能够在 https://example.com 上向此应用程序发出 http 请求,并通过公共互联网从浏览器客户端向 wss://example.com 发送消息。这一切都可以正常工作。

我还需要能够从 http 服务器向 websockets 服务器发送消息。在 http 服务器上,客户端代码如下所示:

const WebSocket = require('ws');
const ws = new WebSocket("wss://example.com");
ws.onopen = () => {
ws.send( JSON.stringify({ msg: "hello from the http server" }) );
}

同样,这工作得很好。但是,对我来说,http服务器需要连接到互联网才能与websockets服务器进行通信,这对我来说是违反直觉的。

在我的开发机器上,将服务器放在localhost:3000上,将 websockets 服务器放在ws://localhost:3000上并且它们相互通信,效果非常好。

有没有办法让外部客户端发送/接收来自wss://example.com的 websocket 消息,而本地 http 服务器与在同一端口和进程上运行的 websocket 服务器"直接"通信?

我想象这将避免 http 服务器调用公共互联网(和 DNS 服务器(并产生延迟。

我已经尝试了以下内容(在 http 服务器连接到 websockets 服务器的代码中(

const ws = new WebSocket("wss://localhost");
const ws = new WebSocket("ws://localhost");

如果我使用wss://,则像在开发计算机上一样将服务器称为localhost127.0.0.1会给出SSL错误...

Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames

。如果我在端口 80 上使用ws://,则会出现"无法连接"错误

code: 'ECONNREFUSED', syscall: 'connect', address: '127.0.0.1', port: 80

我已经寻找了问题的答案,但我什么也没找到。我知道我可能使用了错误的术语进行搜索!

> 我使用 express 和 ws 创建了一个 https 服务器和一个 websockets 服务器,它们在 Ubuntu 18.04 服务器上从相同的 Node 进程和相同的端口 (443( 运行。

没有。。。它只是一个HTTPS服务器,你的Web套接字运行在它上面。 Web 套接字连接最初是 HTTP 请求,然后"升级"为 Web 套接字。

一个基础服务器,绑定到 TCP 端口,这些连接由 Web 套接字库或 HTTP 请求的处理程序处理,具体取决于请求方法和协议。

我还需要能够从 http 服务器向 websockets 服务器发送消息。在 http 服务器上,客户端代码如下所示:

这没有任何意义。 它们是相同的应用程序,对吧?

只需从处理 Web 套接字数据的其他函数调用所需的任何函数,而无需发出额外的 HTTP 请求。

但是,对我来说,http服务器需要连接到互联网才能与websockets服务器进行通信,这对我来说是违反直觉的。

这听起来不像是在"上网"。 发生这种情况时,您更有可能在本地建立连接。 不过,当您可以直接调用代码时,效率不高。

最新更新