前端开发经常需要实现与后端实时通信的场景,如在线聊天室、实时推送等。而这些功能都需要使用到长连接(websocket)。本文将介绍如何使用 PM2 和 Socket.IO 工具实现长连接功能。
PM2
PM2 是一款带有负载均衡功能的 Node.js 进程管理工具,它可以帮助我们简化 Node.js 应用程序的部署和管理。它主要的特性有:
- 内置负载均衡(可以将请求均衡的分配到多个进程之间)
- 内置进程守护、健康监测等功能
- 方便的日志管理和日志分割
此外它还有很多高级功能,如集群管理等,不再赘述。本文仅仅介绍其基本用法。
安装
PM2 可以通过 npm 安装,输入以下命令即可安装:
npm install -g pm2
基本用法
PM2 主要分为两个部分:管理进程和管理进程守护方式。我们先来学习进程的管理。
启动一个 Node.js 程序:
pm2 start app.js
查看已经启动的进程:
pm2 list
重新启动一个进程:
pm2 restart app
停止一个进程:
pm2 stop app
移除一个进程(会删除所有 PM2 设置):
pm2 delete app
常用的命令已经介绍完,下面我们来介绍 PM2 的进程守护方式。
进程守护
PM2 有以下几种进程守护方式:
- fork:默认值,PM2 fork 出子进程来执行 Node.js 程序
- cluster:允许项目使用多进程,当前进程数超出 CPU 数量时,PM2 自动创建新进程
- one-launch:在 PM2 中只启动一个实例
这些方式可以通过 PM2 的命令行参数 --fork
、--cluster
、--single
来传递给 PM2。
Socket.IO
Socket.IO 是基于 websocket 封装的一款实时通信库,使用它可以轻松地实现双向实时通信。它有以下几个核心模块:
socket
:包含一个 socket 实例的所有事件及方法server
:Socket.IO 服务器的核心模块client
:Socket.IO 客户端的核心模块namespace
room
下面我们来介绍 Socket.IO 的基本用法。
客户端
在客户端使用 Socket.IO 时,需要先引入它的客户端库:
<script src="/socket.io/socket.io.js"></script>
然后创建一个 Socket.IO 实例:
var socket = io();
创建成功后,就可以通过以下方式与服务器进行实时通信了:
socket.emit('message', { my: 'data' });
socket.on('message', function(data) { console.log(data); });
服务器端
在服务器使用 Socket.IO 时,需要先引入它的 Node.js 模块:
var io = require('socket.io')(server);
创建 Socket.IO 实例后,可以添加以下监听事件:
connection
:客户端连接时触发message
:客户端发送消息时触发disconnect
:客户端断开连接后触发
下面是一个例子:
var io = require('socket.io')(server); io.on('connection', function(socket) { console.log('a user connected'); socket.on('message', function(data) { console.log(data); io.emit('message', data); }); socket.on('disconnect', function() { console.log('user disconnected'); }); });
PM2 + Socket.IO 实现长连接
有了上面两个工具的介绍,我们就可以轻松地实现长连接了。我们可以按照下面的步骤来进行:
- 创建 Socket.IO 服务器
- 使用 PM2 启动 Socket.IO 服务器
- 客户端连接 Socket.IO 服务器
下面是一个例子:
服务器端代码
var app = require('http').createServer(); var io = require('socket.io')(app); io.on('connection', function(socket) { console.log('a user connected'); socket.on('message', function(data) { console.log(data); io.emit('message', data); }); socket.on('disconnect', function() { console.log('user disconnected'); }); }); app.listen(3000);
PM2 启动脚本
在项目根目录下创建一个 app.js
文件,写入以下内容:
var app = require('http').createServer(); var io = require('socket.io')(app); io.on('connection', function(socket) { console.log('a user connected'); socket.on('message', function(data) { console.log(data); io.emit('message', data); }); socket.on('disconnect', function() { console.log('user disconnected'); }); }); app.listen(3000);
然后在项目根目录下创建一个 pm2.json
文件,写入以下内容:
{ "apps": [{ "name": "socketIO", "script": "app.js", "instances": "max", "exec_mode": "cluster", "error_file": "/var/log/pm2/socketIO-err.log", "out_file": "/var/log/pm2/socketIO-out.log" }] }
然后启动项目:
pm2 start pm2.json
客户端代码
首先在 HTML 文件中引入 Socket.IO 客户端库:
<script src="/socket.io/socket.io.js"></script>
然后使用以下代码连接 Socket.IO 服务器:
var socket = io('http://localhost:3000'); socket.on('connect', function() { console.log('connected'); }); socket.on('message', function(data) { console.log(data); }); socket.on('disconnect', function() { console.log('disconnected'); }); // 发送数据 socket.emit('message', { name: 'user', message: 'hello world' });
总结
本文主要介绍了 PM2 和 Socket.IO 这两个工具的基本用法,并结合示例代码演示了如何使用它们实现长连接。使用 PM2 可以方便地管理进程,使用 Socket.IO 可以轻松地实现双向实时通信。掌握这两个工具,可以帮助我们更加便利地实现前端实时通信功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6593aaedeb4cecbf2d852335