本文介绍了如何使用 PM2、Express、Mongoose 等工具实现一个 WebSocket 应用,让你能够更好地应对实时通信的场景。
为什么使用 WebSocket?
WebSocket 是一种新型的网络通信协议,它采用了 WebSocket 协议和 WebSockets API,可以在客户端和服务器之间建立实时的双向通信。与传统的 HTTP 请求-响应模式相比,WebSocket 允许服务器主动向客户端推送数据,降低了延迟和带宽的消耗,并提高了用户体验。
在实际的应用场景中,WebSocket 适用于实时通信、多人游戏、在线聊天、实时交易、股票行情、视频直播等需要高实时性、高并发性的场景。
技术方案概述
- 后端框架:Express
- 数据库:Mongoose
- 进程管理:PM2
- 前端框架:Vue.js
- 实时通信协议:WebSocket
服务端代码实现
在服务端实现 WebSocket 功能需要借助于 socket.io 开源库,通过 Express 中间件来实现。
安装和初始化项目
首先创建一个新项目并安装 Express 和 Mongoose 等必要的依赖。
mkdir websocket-demo cd websocket-demo npm init -y npm install express mongoose socket.io --save
然后在项目根目录下创建 app.js
文件,并引入必要的模块。
const express = require('express'); const http = require('http'); const mongoose = require('mongoose'); const socketIO = require('socket.io');
要想使用 Socket.io 进行 WebSocket 通信,需要创建一个 HTTP 服务器,并将其传递给 Socket.io。
const app = express(); const server = http.createServer(app); const io = socketIO(server);
连接 MongoDB
在 app.js
中,连接 MongoDB 可以使用 Mongoose 进行操作。可以在 app.js
中添加以下代码:
mongoose.connect('mongodb://localhost/websocket_demo', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }).then(() => { console.log('Connected to MongoDB'); }).catch((err) => { console.log('Error:', err.message); });
实现 WebSocket
现在已经创建了一个 HTTP 服务器,并引入了 Socket.io,下一步就是在 Express 中间件上应用 Socket.io。
io.on('connection', (socket) => { console.log('Client connected'); socket.on('event', (data) => { console.log(data); }); socket.on('disconnect', () => { console.log('Client disconnected'); }); }); app.use((req, res, next) => { req.io = io; next(); }); app.use('/api/test', require('./routes/test'));
这里使用了 io.on()
方法监听客户端连接事件。在连接成功后就可以注册事件监听了。这里用 socket.on()
监听客户端发送过来的 event
事件。在 socket.on()
内部,可以做任何想做的操作,例如向所有客户端广播信息、更新数据库等等。在客户端断开连接时,可以使用 socket.on('disconnect')
事件进行监听。
同时,在 app.js
中使用 Express 的路由中间件来处理客户端的 HTTP 请求。这里只提供了一个测试用例。
app.use('/api/test', require('./routes/test'));
启动服务
在 app.js
中,增加以下代码在本地环境中启动应用。
const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Server started on port ${port}`); });
可以使用 npm start
命令启动应用。但这里推荐使用 PM2 来实现进程管理,可以提高项目的稳定性和可用性。
PM2 进程管理
在 Node.js 项目中,使用 PM2 可以实现进程管理,包括常驻服务、自动拉起、进程监控等功能,这样可以保证服务稳定运行,并且可以在服务器的 CPU、内存等系统资源受限时自动处理请求。
使用默认的 pm2 命令启动应用。
pm2 start app.js
或者,使用 pm2-api 启动应用。
npm install pm2-api -g pm2 start app.js -i max pm2 list
使用 pm2-api,可以通过 HTTP 接口实现进程管理,例如:
curl http://localhost:9615/status
现在,服务器已经可以成功地监听 WebSocket 事件,并与客户端进行实时通信。
服务端完整示例代码:https://github.com/xindoo/websocket-demo
客户端代码实现
使用 npm install socket.io-client
命令安装 Socket.io 客户端。
import io from 'socket.io-client'; var socket = io('http://localhost:3000'); socket.on('connect', function () { console.log('Connected!'); }).on('event', function (data) { console.log(data); }).on('disconnect', function () { console.log('Disconnected!'); });
在客户端中使用 io()
方法连接服务器,监听 connect
、event
、disconnect
事件,分别表示连接成功、接收到服务器传输的数据和断开连接。
客户端完整示例代码:https://github.com/xindoo/websocket-client-demo
总结
本文介绍了如何使用 PM2、Express、Mongoose 等工具实现一个 WebSocket 应用。Socket.io 提供了强大、灵活的实时通信功能。使用 PM2 可以实现进程管理,保证服务稳定运行。通过本文,你可以掌握 WebSocket 的基本知识,了解如何在 Express 中使用 Socket.io 实现 WebSocket 功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6593d684eb4cecbf2d875c96