👓💻 如何在 Node.js 服务之间建立 Websocket 连接
互联网上大多数教程和课程都是关于如何通过 WebSocket 将浏览器连接到服务器的。在这篇博文中,我想向你展示如何使用 WebSocket 将服务器相互连接,并在此过程中进行一些解释。
什么是 WebSocket?
WebSockets
是一种双向连接,是通过 HTTP 发起的通信协议。
这意味着服务器和客户端都可以发送和响应消息并相互通信,而无需创建新的连接,因为 WebSockets 始终保持连接。
WebSocket 需要通过 HTTP 连接来告知双方您想要升级到 WebSocket。然后,该连接将升级到 WebSocket。您可以看到这一点,因为所有 WebSocket 连接的URL 中都带有ws://
而不是。http://
Websocket 连接也支持安全连接,您应该在生产环境中使用它。就像在 HTTP 中一样,只需添加s
. http
would behttps
和ws
would be 即可wss
。您也不应该将安全连接与不安全的连接混用。总而言之,务必确保所有连接都安全。
在本小教程中,我们将连接三个服务并在它们之间发送消息。我们还将添加彩色日志,以便于阅读日志。此外,我们还将使用 nodemon 来简化开发。
设置
让我们首先创建我们的项目。
mkdir websockets-tutorial
cd websockets-tutorial
npm init -y
git init
现在,让我们添加我们将要使用的包并创建我们需要的文件。
npm i -s chalk nodemon socket.io socket.io-client
touch service1.js service2.js service3.js
下一步是创建我们的 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"
},
实施
首先,我们来编写一个输出彩色日志的日志函数。
我们需要chalk
先导入。
const chalk = require('chalk');
然后我们就可以实现一个简单的log
功能。
const log = (msg) => console.log(chalk.bold.green.bgBlack('Service1:'), chalk.white.bgBlack(`${msg}`))
我们将在每个文件中使用相同的函数,但需要进行一些修改。以下代码部分需要在我添加[ ]
代码的地方进行修改。
chalk.bold.[green].bgBlack('Service[1]:')
[green]
我会为每项服务选择不同的颜色,当然也[1]
需要更改为数字。
WebSocket 服务器
首先让我们导入我们需要的包。
const server = require('http').createServer();
const io = require('socket.io')(server, {
path: '/'
});
http
这里我们从 node导入服务器并将其传递给socket.io
。
我们socket.io
需要设置服务器监听传入连接的路径。在本例中,它是根路径/
。
在文件末尾,添加以下代码以使服务器监听端口。
server.listen(4000);
log('started server on port 4000')
在服务 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')
});
});
好的,我们正在处理 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')
现在让我们去实现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}`))
到目前为止,代码看起来像service1.js
。唯一的变化是我们现在导入了socket.io-client
as 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')
});
});
这段代码和 中的代码一样service1.js
。
现在我们来实现客户端。首先,我们需要初始化客户端。
// Client Code
const serverAddr = 'http://localhost:4000';
const socket = ioClient(serverAddr, {
path: '/'
});
必须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}`)
});
});
如你所见,这看起来与服务器几乎相同。我们有.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');
现在我们知道了如何连接两个服务!
在代码库中,你会看到三个服务!
让我们来做点不一样的!与其让我解释具体实现,不如直接展示文件,你可以在评论区尝试解释一下它的工作原理!
所以,这里是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');
你可以在这里找到 repo
👋打个招呼! Instagram | Twitter | LinkedIn | Medium | Twitch | YouTube
鏂囩珷鏉ユ簮锛�https://dev.to/lampewebdev/how-to-set-up-websocket-connections- Between-nodejs-services-2lm