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

时间:2019-03-08 21:57:20

标签: node.js websocket socket.io

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

应用A, App B, App C, App D, App E,

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

我尝试使用socket.io和socket.io-client库来实现此目的。由于我的应用程序A必须是发起连接的应用程序,因此我使用了socket.io-client库,对于应用程序B,C,D,E,我使用了socket.io库。在通常情况下,应用程序B,C,D,E将充当客户端,并使用socket.io-client库连接到作为服务器并使用socket.io库的应用程序A。就我而言,情况恰恰相反,因为App B,C,D,E不了解App A,而App A知道其IP地址。

使用socket.io-client库时遇到的问题是如何跟踪App A中的套接字ID,以便在需要时可以使用套接字ID发出特定的套接字?与服务器端使用socket.io库的情况一样,socket.io-client库似乎无法跟踪连接的套接字ID(列表)。

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

App A代码:

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);
    }
});

应用B,C,D,E代码:

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

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

socket.listen(PORT);

1 个答案:

答案 0 :(得分:1)

您似乎需要明确跟踪与应用程序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与其关联的套接字的哈希。