基于Node.js的WebSocket通信实现

yizhihongxing

关于“基于Node.js的WebSocket通信实现”的完整攻略,我将分为以下几个部分进行讲解:

  1. WebSocket通信简介
  2. Node.js搭建WebSocket服务器
  3. WebSocket客户端与服务器的交互
  4. 示例说明

1. WebSocket通信简介

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得 浏览器与服务器之间的数据交换变得更加实时和高效。使用 WebSocket,我们可以在客户端和服务器之间建立一条持久的、双向的通信线路,可以通过它来传递任何数据。

2. Node.js搭建WebSocket服务器

在 Node.js 中,我们可以使用 ws 模块来搭建 WebSocket 服务器。使用如下代码来搭建WebSocket服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 }); //监听8080端口

wss.on('connection', function connection(ws) {
  console.log('client connected'); //客户端连接成功
  //接收客户端发送的消息
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });
  //发送消息给客户端
  ws.send('Hello, I am server!');
});

在上面的代码中,我们使用 WebSocket.Server 创建了一个 WebSocket 服务器,并通过 wss.on('connection', function(connection) {...}) 来监听客户端的连接请求。当有客户端连接时,connection 参数代表当前连接的客户端,通过 connection.send(...) 来向客户端发送消息。

3. WebSocket客户端与服务器的交互

在客户端中,我们可以通过 WebSocket 类提供的实例方法来连接 WebSocket 服务器并进行数据交换。如下示例所示:

const ws = new WebSocket('ws://localhost:8080'); //连接WebSocket服务器

ws.onopen = function() { //监听连接成功
  console.log('client connected');
  //向服务器发送消息
  ws.send('Hello, I am client!');
};

ws.onmessage = function(event) { //监听服务端的消息
  console.log('received: ' + event.data);
};

当客户端与服务器建立连接后,通过 ws.send(...) 来向服务器发送消息,而服务器则会通过 connection.send(...) 来向客户端发送消息。在客户端中,我们可以通过监听 ws.onmessage 事件来接收服务器发送的消息。

4. 示例说明

示例1:广播消息

在这个示例中,我们将搭建一个简单的聊天室,客户端与服务器可以实时收发消息,同时客户端的消息也会被广播给其他客户端。如下所示:

// server.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function(connection) {
  console.log('client connected');

  connection.on('message', function(message) {
    console.log(`received: ${message}`);
    //服务器发送消息给所有客户端
    wss.clients.forEach(client => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(`${message}`);
      }
    });
  });
});

// client.html
<html>
<head>
  <title>WebSocket Chat</title>
</head>
<body>
  <input id="input" type="text" placeholder="请输入消息" />
  <button id="send">发送</button>
  <ul id="messages"></ul>
  <script>
    const ws = new WebSocket('ws://localhost:8080');
    const input = document.querySelector('#input');
    const sendBtn = document.querySelector('#send');
    const messages = document.querySelector('#messages');

    sendBtn.onclick = function() {
      const message = input.value;
      ws.send(message);
      input.value = '';
    };

    ws.onmessage = function(event) {
      const message = event.data;
      const li = document.createElement('li');
      li.textContent = message;
      messages.appendChild(li);
    };
  </script>
</body>
</html>

在该示例中,服务器接收到客户端发来的消息后,通过 wss.clients.forEach() 来向所有连接到服务器的客户端广播消息。而客户端接收到服务器发送的消息后,将其添加到相应的聊天记录区域中。

示例2:心跳检测

WebSocket 是基于 TCP 连接的,因此客户端与服务器之间可以保持一个连接。但是,如果在一段时间内没有数据传输,那么该连接可能会被中断。为了解决这个问题,我们可以通过心跳检测的方式来保持连接,如下所示:

// server.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function(connection) {
  console.log('client connected');

  //每隔20s向客户端发送心跳包
  const heartbeat = setInterval(() => {
    connection.send('heartbeat');
  }, 20000);

  connection.on('message', function(message) {
    console.log(`received: ${message}`);
    //其他逻辑处理
  });

  //客户端断开连接时,清除心跳包发送定时器
  connection.on('close', function() {
    clearInterval(heartbeat);
  });
});

// client.html
<html>
<head>
  <title>WebSocket Heartbeat Test</title>
</head>
<body>
  <script>
    const ws = new WebSocket('ws://localhost:8080');

    ws.onopen = function() {
      console.log('client connected');
    };

    ws.onmessage = function(event) {
      const message = event.data;
      if (message === 'heartbeat') {
        console.log('server heartbeat');
        return;
      }
      console.log(`received: ${message}`);
    };
  </script>
</body>
</html>

在该示例中,服务器每隔一段时间向客户端发送一个心跳包,客户端接收到心跳包后,立即返回一个消息,以确认客户端还处于连接状态。而服务器在接收到心跳包后,不需要处理任何逻辑,只需要等待下一个心跳包即可。如果在一定时间内没有收到心跳包,服务器就可以认为客户端已经掉线,从而进行相应的处理。

以上就是关于“基于Node.js的WebSocket通信实现”的完整攻略的讲解,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Node.js的WebSocket通信实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Node.js查询MySQL并返回结果集给客户端的全过程

    下面提供一个完整的“Node.js查询MySQL并返回结果集给客户端的全过程”。 步骤一:安装和配置 首先,在本地安装Node.js和MySQL服务。然后,使用npm安装mysql模块,它是连接到MySQL的标准Node.js库。可以在终端中运行以下命令进行安装: npm install mysql 接下来,在项目中引入mysql模块,以便使用它的API: …

    node js 2023年6月8日
    00
  • Express之托管静态文件的方法

    下面我将为您详细讲解关于 Express 中托管静态文件的方法。 Express 托管静态文件的方法 在 Express 中,我们可以使用 express.static 中间件来托管静态文件。express.static 模块的作用是将一个或多个目录指派为包含静态资产的目录,这些资产将直接送至客户端。 使用方式 我们可以通过如下方式使用 express.st…

    node js 2023年6月9日
    00
  • Linux环境下nodejs的安装图文教程

    下面是“Linux环境下nodejs的安装图文教程”的完整攻略。 1. 安装前准备 在安装nodejs之前,需要确保我们的Linux环境中已经安装了相关的依赖。具体来说,可以执行以下命令来安装: Debian/Ubuntu: sudo apt-get updatesudo apt-get install -y build-essential curl wge…

    node js 2023年6月8日
    00
  • js宝典学习笔记(上)

    JS宝典学习笔记(上)攻略 1. 了解JS基础语法 要学习JS,首先要掌握其基础语法。包括: 变量、常量的定义和使用; 数据类型、运算符等基本概念; 流程控制、函数、循环等基本语句的使用。 建议通过《JavaScript高级程序设计》等经典教材,辅以实战演练和练习,掌握JS基础语法。 2. 掌握DOM操作 DOM(文档对象模型)是JS的重要组成部分。掌握DO…

    node js 2023年6月8日
    00
  • nodejs实现套接字服务功能详解

    Node.js实现套接字服务功能详解 本文介绍了如何使用Node.js实现套接字(Socket)服务功能。Socket是在应用程序之间传输数据的一种机制,即一种在计算机网络上运行的进程间通信机制。在Node.js中,可以使用net模块来创建套接字服务器。下面详细介绍Net模块的使用方法。 Net模块 Net模块提供了一个用于创建TCP或本地套接字服务器的AP…

    node js 2023年6月8日
    00
  • node模块机制与异步处理详解

    Node模块机制与异步处理详解 1. Node模块机制 Node的模块机制是通过CommonJS规范实现的,它允许我们将代码封装成可重用的模块,并在不同的文件中进行引用。Node中有三种类型的模块: 核心模块:Node内置的模块,例如fs和http。 文件模块:位于本地文件系统中的模块,通过相对或绝对路径引用。 第三方模块:由NPM管理的模块,可以通过req…

    node js 2023年6月8日
    00
  • nest.js,egg.js,midway,express,koa的区别小结

    这是一篇关于几个Node.js的框架的区别小结的攻略。这里我们将会对Nest.js、Egg.js、Midway、Express和Koa几个框架进行比较,并从不同的角度去探讨它们的各自优势和适用场景。 Nest.js 架构风格:基于Angular开发的服务端MVC框架,基于模块化和依赖注入的理念。 优势: 具有很好的可扩展性和可维护性。 内置了丰富的功能模块,…

    node js 2023年6月8日
    00
  • JavaScript库omit源码解析

    JavaScript库omit是一种用于JavaScript对象的简化和转换的工具库。它涉及的功能包括筛选对象的键、重新路由对象的键以及将键中的值删除,它的源码解析可以让我们更好地理解它的实现原理。 一、基本用法 在使用omit库之前,我们需要通过npm安装它:npm install omit.js。 omit库提供了两个主要方法:omit和renameKe…

    node js 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部