👓💻 如何在 Node.js 服务之间建立 Websocket 连接

2025-06-09

👓💻 如何在 Node.js 服务之间建立 Websocket 连接

互联网上大多数教程和课程都是关于如何通过 WebSocket 将浏览器连接到服务器的。在这篇博文中,我想向你展示如何使用 WebSocket 将服务器相互连接,并在此过程中进行一些解释。

什么是 WebSocket?

WebSockets是一种双向连接,是通过 HTTP 发起的通信协议。

这意味着服务器和客户端都可以发送和响应消息并相互通信,而无需创建新的连接,因为 WebSockets 始终保持连接。

WebSocket 需要通过 HTTP 连接来告知双方您想要升级到 WebSocket。然后,该连接将升级到 WebSocket。您可以看到这一点,因为所有 WebSocket 连接的URL 中都带有ws://而不是。http://

Websocket 连接也支持安全连接,您应该在生产环境中使用它。就像在 HTTP 中一样,只需添加s. httpwould behttpswswould be 即可wss。您也不应该将安全连接与不安全的连接混用。总而言之,务必确保所有连接都安全。

在本小教程中,我们将连接三个服务并在它们之间发送消息。我们还将添加彩色日志,以便于阅读日志。此外,我们还将使用 nodemon 来简化开发。

设置

让我们首先创建我们的项目。

mkdir websockets-tutorial
cd websockets-tutorial
npm init -y
git init
Enter fullscreen mode Exit fullscreen mode

现在,让我们添加我们将要使用的包并创建我们需要的文件。

npm i -s chalk nodemon socket.io socket.io-client
touch service1.js service2.js service3.js
Enter fullscreen mode Exit fullscreen mode

下一步是创建我们的 npm 脚本。
打开package.json并添加以下脚本:

  "scripts": {
    "start": "npm run service1 & npm run service2 & npm run service3",
    "service1": "nodemon service1.js",
    "service2": "nodemon service2.js",
    "service3": "nodemon service3.js"
  },
Enter fullscreen mode Exit fullscreen mode

实施

首先,我们来编写一个输出彩色日志的日志函数。
我们需要chalk先导入。

const chalk = require('chalk');
Enter fullscreen mode Exit fullscreen mode

然后我们就可以实现一个简单的log功能。

const log = (msg) => console.log(chalk.bold.green.bgBlack('Service1:'), chalk.white.bgBlack(`${msg}`))
Enter fullscreen mode Exit fullscreen mode

我们将在每个文件中使用相同的函数,但需要进行一些修改。以下代码部分需要在我添加[ ]代码的地方进行修改。

chalk.bold.[green].bgBlack('Service[1]:')
Enter fullscreen mode Exit fullscreen mode

[green]我会为每项服务选择不同的颜色,当然也[1]需要更改为数字。

WebSocket 服务器

首先让我们导入我们需要的包。

const server = require('http').createServer();
const io = require('socket.io')(server, {
    path: '/'
});
Enter fullscreen mode Exit fullscreen mode

http这里我们从 node导入服务器并将其传递给socket.io
我们socket.io需要设置服务器监听传入连接的路径。在本例中,它是根路径/

在文件末尾,添加以下代码以使服务器监听端口。

server.listen(4000);
log('started server on port 4000')
Enter fullscreen mode Exit fullscreen mode

在服务 1 中端口为 4000,在服务 2 中端口为 5000,在服务 3 中端口为 6000。

好的,现在让我们实现实际的沟通。

io.on('connection', client => {
    log('someone connected');

    client.on('sayHello', data => {
        log(`event: sayHello, data: ${data}`)
        client.emit('halloToYouTo', 'Hello from http://localhost:4000')
    });

    client.on('disconnect', () => {
        log('client disconnected')
    });
});
Enter fullscreen mode Exit fullscreen mode

好的,我们正在处理 WebSocket。WebSocket 始终处于连接状态,因此我们需要对发生的事情做出反应。这就是为什么您会看到.on().emit()
.on()这表示该函数会在发生某些事情时运行。
例如:io.on('connection', someFunction);。您可以在脑海中将其理解为:“当有人连接到我们的 WebSocket 时,该函数someFunction将会运行”。
其中有以下代码client.on('sayHello', sayHelloFunction)sayHelloFunction客户端发出“SayHello”事件后,该函数将会执行。然后,我们发出.emit()“HalloToYouTo”事件。该事件随后会发送到所有打开的连接。那么您应该已经明白它的作用disconnect了,对吧?

service这是.js文件的完整代码

const chalk = require('chalk');
const server = require('http').createServer();
const io = require('socket.io')(server, {
    path: '/'
});

const log = (msg) => console.log(chalk.bold.green.bgBlack('Service1:'), chalk.white.bgBlack(`${msg}`))

io.on('connection', client => {
    log('someone connected');

    client.on('sayHello', data => {
        log(`event: sayHello, data: ${data}`)
        client.emit('halloToYouTo', 'Hello from http://localhost:4000')
    });

    client.on('disconnect', () => {
        log('client disconnected')
    });
});

server.listen(4000);
log('started server on port 4000')
Enter fullscreen mode Exit fullscreen mode

现在让我们去实现servie2.js

const chalk = require('chalk')
const server = require('http').createServer();
const ioServer = require('socket.io')(server, {
    path: '/'
});
const ioClient = require('socket.io-client');

const log = (msg) => console.log(chalk.bold.cyan.bgBlack('Service2:'), chalk.white.bgBlack(`${msg}`))
Enter fullscreen mode Exit fullscreen mode

到目前为止,代码看起来像service1.js。唯一的变化是我们现在导入了socket.io-clientas ioClient

接下来我们将再次设置服务器

// Server Code
ioServer.on('connection', client => {
    log('someone connected');
    client.on('sayHello', data => {
        log(`event: sayHello, data: ${data}`)
        client.emit('halloToYouTo', "hello from http://localhost:5000")
    });
    client.on('disconnect', () => {
        log('event: disconnect, client disconnected')
    });
});
Enter fullscreen mode Exit fullscreen mode

这段代码和 中的代码一样service1.js
现在我们来实现客户端。首先,我们需要初始化客户端。

// Client Code
const serverAddr = 'http://localhost:4000';
const socket = ioClient(serverAddr, {
    path: '/'
});
Enter fullscreen mode Exit fullscreen mode

必须serverAddr是我们要连接的服务器地址。在我们的例子中,它是service1地址http://localhost:4000。记住,我们需要使用 HTTP 进行连接,但在第一次握手之后,连接将升级为 WebSocket 连接。现在我们已经完成了设置,现在可以连接并设置我们想要响应的事件了。

socket.on('connect', (data) => {
    log(`connected to ${serverAddr}`);

    socket.emit('sayHello', 'Hello World from client');

    socket.on('halloToYouTo', data => {
        log(`event: helloToYouTo, ${data}`)
    });
});
Enter fullscreen mode Exit fullscreen mode

如你所见,这看起来与服务器几乎相同。我们有.emit().on()。因此,当我们连接到服务器时,我们将看到.emit()事件sayHello,如果我们回顾 ,service1.js我们会看到它正在监听该事件,并且它会发出该helloToYouTo事件。所以我们向 发送了一条消息service1.js,并收到了一条消息。很简单,对吧?

好的,这是完整的service2.js

const chalk = require('chalk')
const server = require('http').createServer();
const ioServer = require('socket.io')(server, {
    path: '/'
});
const ioClient = require('socket.io-client');

const log = (msg) => console.log(chalk.bold.cyan.bgBlack('Service2:'), chalk.white.bgBlack(`${msg}`))

// Server Code
ioServer.on('connection', client => {
    log('someone connected');
    client.on('sayHello', data => {
        log(`event: sayHello, data: ${data}`)
        client.emit('halloToYouTo', "hello from http://localhost:5000")
    });
    client.on('disconnect', () => {
        log('event: disconnect, client disconnected')
    });
});

// Client Code
const serverAddr = 'http://localhost:4000';
const socket = ioClient(serverAddr, {
    path: '/'
});
socket.on('connect', (data) => {
    log(`connected to ${serverAddr}`);

    socket.emit('sayHello', 'Hello World from client');

    socket.on('halloToYouTo', data => {
        log(`event: helloToYouTo, ${data}`);
    });
});

server.listen(5000);
log('started server on port 5000');
Enter fullscreen mode Exit fullscreen mode

现在我们知道了如何连接两个服务!
在代码库中,你会看到三个服务!
让我们来做点不一样的!与其让我解释具体实现,不如直接展示文件,你可以在评论区尝试解释一下它的工作原理!
所以,这里是service3.js

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

const log = (msg) => console.log(chalk.bold.magenta.bgBlack('Service3:'), chalk.white.bgBlack(`${msg}`));

// Client Code
const clientAddr = 'http://localhost:5000';
const socket = ioClient(clientAddr, {
    path: '/'
});

socket.on('connect', (data) => {
    log(`connected to ${clientAddr}`);
    socket.emit('sayHello', 'Hello World from client');

    socket.on('halloToYouTo', data => {
        log(`event: halloToYouTo, data: ${data}`);
    });
});
log('started client ready');
Enter fullscreen mode Exit fullscreen mode

您的输出应该是这样的:
替代文本

你可以在这里找到 repo

👋打个招呼! Instagram | Twitter | LinkedIn | Medium | Twitch | YouTube

鏂囩珷鏉ユ簮锛�https://dev.to/lampewebdev/how-to-set-up-websocket-connections- Between-nodejs-services-2lm
PREV
我保证这是 Async / Await 的实用指南
NEXT
如何利用 Docker 运行 WordPress