Node.js应用程序通过WebSocket与多个Node应用程序通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js应用程序通过WebSocket与多个Node应用程序通信相关的知识,希望对你有一定的参考价值。

我有5个Node.js应用程序。让我们假设我拥有的5个应用程序被称为:

App A,App B,App C,App D,App E,

我希望App A使用他们的IP地址连接到Apps B,C,D,E。我想使用WebSocket协议(以便B,C,D,E可以回复某些事件)。应用程序B,C,D,E不知道彼此之间的通信,也不知道彼此存在。应用B,C,D,E不知道App A存在。应用程序B,C,D,E运行在单独的硬件上,每个硬件都有自己的IP地址。 App A再次通过WebSocket启动与应用程序B,C,D,E的连接。

我尝试使用socket.io和socket.io-client库来实现这一点。由于我的App A需要启动连接,我使用了socket.io-client库,而对于Apps B,C,D,E,我使用了socket.io库。在通常情况下,应用程序B,C,D,E将充当客户端,并将使用socket.io-client库连接到App A,它将是服务器并将使用socket.io库。在我的情况下,它是相反的,因为应用程序B,C,D,E不知道应用程序A,并且应用程序A知道它们的IP地址。

我在使用socket.io-client库时遇到的问题是如何跟踪App A中的套接字ID,以便在需要时使用套接字ID发送到特定的套接字? socket.io-client库似乎没有跟踪(列表)连接的套接字ID,就像服务器端使用socket.io库一样。

这是我到目前为止尝试过的一个例子:

应用程序代码:

const io = require('socket.io-client');
const socketB = io('http://10.11.18.1:3000');
const socketC = io('http://10.11.19.1:3000');
const socketD = io('http://10.11.20.1:3000');
const socketE = io('http://10.11.21.1:3000');

socketB.on('connect', function () {
    if (socket.connected) {
        console.log(socket.id);
    }
});

socketC.on('connect', function () {
    if (socket.connected) {
        console.log(socket.id);
    }
});

socketD.on('connect', function () {
    if (socket.connected) {
        console.log(socket.id);
    }
});

socketE.on('connect', function () {
    if (socket.connected) {
        console.log(socket.id);
    }
});

App B,C,D,E代码:

const io = require('socket.io');
const socket = io();
const PORT = 80;

socket.on('connection', client => {
...
});

socket.listen(PORT);
答案

看起来您需要明确跟踪应用A连接到的服务器。如果我正确理解您的问题,您可以执行以下操作并将套接字ID映射到套接字:

const io = require('socket.io-client');

const idToSocket = {};
const sockets = [
  'http://10.11.18.1:3000',
  'http://10.11.19.1:3000',
  'http://10.11.20.1:3000',
  'http://10.11.21.1:3000'
]
  .map(url => io(url))
  .map(socket => {
    socket.on('connect', () => {
      idToSocket[socket.id] = socket;
    });
    return socket;
  });

sockets数组是所有套接字的数组,idToSocket是与其相关的套接字id的哈希值。

以上是关于Node.js应用程序通过WebSocket与多个Node应用程序通信的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WebSocket 实现在传输多个文件时比 HTTP/2 Push 慢? (Node.js / 去)

Node.js - 具有 WebSocket 代理和 SSL 支持的良好 WebServer?

WebSocket 错误,意外响应代码:200 与 Nginx 和 Node.js

与 Hasura 的 WebSocket 连接不适用于 Node.js 上的 ApolloClient v3

websocket与node.js完美结合

受祝福的服务器(Node.js)通过 websocket 到浏览器中的 Xterm.js 客户端