Express.js 中使用 WebSocket 实现即时通信

WebSocket 是一种基于 TCP 协议的全双工通信协议,它可以在浏览器和服务器之间建立一个持久的连接,使得服务器可以主动向客户端推送消息,而不需要客户端轮询请求。在实时通信场景中,WebSocket 是一种非常方便的技术,可以用于实现在线聊天、实时游戏等功能。

在 Express.js 中,我们可以通过一些中间件和库来实现 WebSocket 功能。本文将介绍如何使用 ws 和 express-ws 库,在 Express.js 中实现 WebSocket 功能。

安装依赖

我们需要安装 ws 和 express-ws 两个库,分别用于 WebSocket 和 Express.js 中的 WebSocket 功能。

npm install ws express-ws --save

创建 Express.js 应用

我们先创建一个简单的 Express.js 应用,用于演示 WebSocket 功能。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

添加 WebSocket 中间件

我们需要使用 express-ws 中间件来添加 WebSocket 功能到 Express.js 应用中。

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.ws('/', (ws, req) => {
  console.log('WebSocket connected!');
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

在上面的代码中,我们通过调用 express-ws 中间件来添加 WebSocket 功能。app.ws() 方法用于创建 WebSocket 路由,当客户端连接到 / 路径时,会触发回调函数。回调函数中的 ws 参数表示 WebSocket 对象,req 参数表示 HTTP 请求对象。

发送和接收消息

我们可以使用 WebSocket 对象的 send() 方法来发送消息,使用 on('message') 方法来接收消息。

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.ws('/', (ws, req) => {
  console.log('WebSocket connected!');

  ws.send('Welcome to WebSocket server!');

  ws.on('message', (message) => {
    console.log('Received message:', message);
    ws.send('You said: ' + message);
  });
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

在上面的代码中,我们使用 ws.send() 方法发送欢迎消息,使用 ws.on('message') 方法接收客户端发送的消息,并回复相同的消息。

完整示例代码

下面是一个完整的示例代码,包含了 WebSocket 服务端和客户端的代码。

服务端代码:

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.ws('/', (ws, req) => {
  console.log('WebSocket connected!');

  ws.send('Welcome to WebSocket server!');

  ws.on('message', (message) => {
    console.log('Received message:', message);
    ws.send('You said: ' + message);
  });
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

客户端代码:

<!DOCTYPE html>
<html>
<head>
  <title>WebSocket Client</title>
</head>
<body>
  <h1>WebSocket Client</h1>

  <div id="messages"></div>

  <input type="text" id="input" />
  <button id="send">Send</button>

  <script>
    const socket = new WebSocket('ws://localhost:3000/');

    socket.onopen = () => {
      console.log('WebSocket connected!');
    };

    socket.onmessage = (event) => {
      console.log('Received message:', event.data);
      const messages = document.getElementById('messages');
      messages.innerHTML += '<p>' + event.data + '</p>';
    };

    const input = document.getElementById('input');
    const send = document.getElementById('send');

    send.addEventListener('click', () => {
      const message = input.value;
      socket.send(message);
      input.value = '';
    });
  </script>
</body>
</html>

在客户端代码中,我们使用 WebSocket 构造函数来创建 WebSocket 对象,指定服务器地址为 ws://localhost:3000/。在 onopenonmessage 事件中,分别处理连接成功和收到消息的情况。在 send 按钮的点击事件中,使用 socket.send() 方法向服务器发送消息。

总结

本文介绍了如何在 Express.js 中使用 ws 和 express-ws 库,实现 WebSocket 功能。我们通过创建 WebSocket 路由,发送和接收消息,实现了一个简单的实时通信示例。在实际项目中,我们可以使用 WebSocket 来实现在线聊天、实时游戏等功能,提升用户体验。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658ae03deb4cecbf2d02e0b9


纠错
反馈