输出:

服务器运行后,您在多个浏览器中打开 HTML 文件,在一个浏览器中输入的消息将发送到服务器并广播到所有连接的客户端。

Node.js 流

流对于处理大文件或块数据而不是将整个内容加载到内存中至关重要。它们用于:

Node.js 中的流类型:

  1. 可读流:可以从中读取数据的流(例如,文件系统读取)。
  2. 可写流:可以写入数据的流(例如,文件系统写入)。
  3. 双工流:既可以读取也可以写入的流(例如 TCP 套接字)。
  4. 转换流:可以在写入和读取数据时修改或转换数据的流(例如文件压缩)。

示例:使用流读取文件

const fs = require(\\'fs\\');// Create a readable streamconst readStream = fs.createReadStream(\\'largefile.txt\\', \\'utf8\\');// Listen to \\'data\\' event to read chunks of datareadStream.on(\\'data\\', (chunk) => {    console.log(\\'Reading chunk:\\', chunk);});// Listen to \\'end\\' event when the file is fully readreadStream.on(\\'end\\', () => {    console.log(\\'File reading complete\\');});

扩展 Node.js 应用程序

随着应用程序的增长,需要进行扩展来处理增加的流量并确保高可用性。 Node.js 应用程序可以垂直或水平缩放:

Node.js 中的集群模块

Node.js 在单线程上运行,但使用 cluster 模块,您可以通过运行多个 Node.js 进程来利用多核系统。

const cluster = require(\\'cluster\\');const http = require(\\'http\\');const numCPUs = require(\\'os\\').cpus().length;if (cluster.isMaster) {    // Fork workers for each CPU    for (let i = 0; i < numCPUs; i  ) {        cluster.fork();    }    cluster.on(\\'exit\\', (worker, code, signal) => {        console.log(`Worker ${worker.process.pid} died`);    });} else {    // Workers can share the same HTTP server    http.createServer((req, res) => {        res.writeHead(200);        res.end(\\'Hello, world!\\\\n\\');    }).listen(8000);}

结论

WebSockets 和 Socket.IO 提供现代 Web 应用程序所必需的实时双向通信。 Node.js 流可以有效地处理大规模数据,并且使用 NGINX 和 Node 的集群模块进行扩展可确保您的应用程序可以管理大流量。这些技术共同实现了强大的高性能实时应用程序。

","image":"http://www.luping.net/uploads/20240927/172744885266f6c714068ca.jpg","datePublished":"2024-11-02T05:36:07+08:00","dateModified":"2024-11-02T05:36:07+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > WebSockets、Socket.IO 以及与 Node.js 的实时通信

WebSockets、Socket.IO 以及与 Node.js 的实时通信

发布于2024-11-02
浏览:789

WebSockets, Socket.IO, and Real-Time Communication with Node.js

实时通信已成为现代应用程序的关键功能,可实现即时更新、实时数据交换和响应式用户体验。 WebSockets 和 Socket.IO 等技术处于实时交互的最前沿。本文将深入探讨 WebSocket 的概念、如何在 Node.js 中实现它们,以及 Socket.IO 如何简化实时通信。

什么是 WebSocket?

WebSocket 是一种通过单个 TCP 连接提供全双工通信通道的通信协议。与以请求-响应模型运行的 HTTP 协议不同,WebSocket 允许服务器和客户端随时向彼此发送消息,保持开放的连接。

主要特征

  • 持久连接:WebSocket 保持连接打开,减少重新建立连接的需要。
  • 双向通信:服务器和客户端都可以自由发送消息。
  • 低延迟:由于 WebSocket 保持开放连接,因此消除了 HTTP 请求的开销,减少了延迟。

何时使用 WebSocket?

WebSockets 非常适合需要实时、低延迟数据交换的应用程序:

  • 聊天应用程序(例如 Slack、WhatsApp Web)
  • 体育直播更新
  • 股市动态
  • 实时协作工具(例如 Google 文档)

在 Node.js 中设置 WebSocket

Node.js 通过 ws 包原生支持 WebSocket,ws 包是一个轻量级且高效的 WebSocket 通信库。

第 1 步:安装 WebSocket 包

npm install ws

第 2 步:创建 WebSocket 服务器

const WebSocket = require('ws');

// Create a WebSocket server that listens on port 8080
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('Client connected');

    // When the server receives a message
    ws.on('message', (message) => {
        console.log('Received:', message);
        // Echo the message back to the client
        ws.send(`Server received: ${message}`);
    });

    // Handle connection close
    ws.on('close', () => {
        console.log('Client disconnected');
    });
});

console.log('WebSocket server is running on ws://localhost:8080');

解释:

  • WebSocket 服务器侦听端口 8080。
  • 客户端连接时触发连接事件。
  • 当服务器从客户端接收数据时触发消息事件,然后服务器回显该数据。

第 3 步:创建 WebSocket 客户端

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
    console.log('Connected to WebSocket server');
    // Send a message to the server
    ws.send('Hello Server!');
});

ws.on('message', (data) => {
    console.log('Received from server:', data);
});

ws.on('close', () => {
    console.log('Disconnected from server');
});

输出:

Server Console:
Client connected
Received: Hello Server!
Client disconnected

Client Console:
Connected to WebSocket server
Received from server: Server received: Hello Server!
Disconnected from server

什么是Socket.IO?

Socket.IO 是一个构建在 WebSocket 之上的流行库,可简化实时通信。它提供了更高级别的抽象,使实时事件的实现和管理变得更加容易。 Socket.IO 还支持不支持 WebSocket 的浏览器的回退机制,确保广泛的兼容性。

Socket.IO的优点

  • 自动重连:如果连接丢失,自动尝试重新连接。
  • 命名空间和房间:将连接组织到命名空间和房间,允许更结构化的通信。
  • 事件驱动模型:支持自定义事件,让沟通更语义化。

将 Socket.IO 与 Node.js 结合使用

第1步:安装Socket.IO

npm install socket.io

第 2 步:设置 Socket.IO 服务器

const http = require('http');
const socketIo = require('socket.io');

// Create an HTTP server
const server = http.createServer();
const io = socketIo(server, {
    cors: {
        origin: "*",
        methods: ["GET", "POST"]
    }
});

// Handle client connection
io.on('connection', (socket) => {
    console.log('Client connected:', socket.id);

    // Listen for 'chat' events from the client
    socket.on('chat', (message) => {
        console.log('Received message:', message);
        // Broadcast the message to all connected clients
        io.emit('chat', `Server: ${message}`);
    });

    // Handle client disconnect
    socket.on('disconnect', () => {
        console.log('Client disconnected:', socket.id);
    });
});

server.listen(3000, () => {
    console.log('Socket.IO server running on http://localhost:3000');
});

解释:

  • 创建了一个 HTTP 服务器,并附加了 Socket.IO。
  • 连接事件处理新的客户端连接。
  • 聊天事件是用于发送聊天消息的自定义事件,并发出广播消息给所有客户端。

第3步:创建Socket.IO客户端



    Socket.IO Chat
    

    输出:

    服务器运行后,您在多个浏览器中打开 HTML 文件,在一个浏览器中输入的消息将发送到服务器并广播到所有连接的客户端。

    Node.js 流

    流对于处理大文件或块数据而不是将整个内容加载到内存中至关重要。它们用于:

    • 文件上传/下载:流允许您在上传或下载数据时处理数据。
    • 处理大数据:流在处理大文件或连续数据时内存效率更高。

    Node.js 中的流类型:

    1. 可读流:可以从中读取数据的流(例如,文件系统读取)。
    2. 可写流:可以写入数据的流(例如,文件系统写入)。
    3. 双工流:既可以读取也可以写入的流(例如 TCP 套接字)。
    4. 转换流:可以在写入和读取数据时修改或转换数据的流(例如文件压缩)。

    示例:使用流读取文件

    const fs = require('fs');
    
    // Create a readable stream
    const readStream = fs.createReadStream('largefile.txt', 'utf8');
    
    // Listen to 'data' event to read chunks of data
    readStream.on('data', (chunk) => {
        console.log('Reading chunk:', chunk);
    });
    
    // Listen to 'end' event when the file is fully read
    readStream.on('end', () => {
        console.log('File reading complete');
    });
    

    扩展 Node.js 应用程序

    随着应用程序的增长,需要进行扩展来处理增加的流量并确保高可用性。 Node.js 应用程序可以垂直或水平缩放:

    • 垂直扩展:增加单台机器的资源(CPU、RAM)。
    • 水平扩展:跨不同机器或核心运行 Node.js 应用程序的多个实例。

    Node.js 中的集群模块

    Node.js 在单线程上运行,但使用 cluster 模块,您可以通过运行多个 Node.js 进程来利用多核系统。

    const cluster = require('cluster');
    const http = require('http');
    const numCPUs = require('os').cpus().length;
    
    if (cluster.isMaster) {
        // Fork workers for each CPU
        for (let i = 0; i  {
            console.log(`Worker ${worker.process.pid} died`);
        });
    } else {
        // Workers can share the same HTTP server
        http.createServer((req, res) => {
            res.writeHead(200);
            res.end('Hello, world!\n');
        }).listen(8000);
    }
    

    结论

    WebSockets 和 Socket.IO 提供现代 Web 应用程序所必需的实时双向通信。 Node.js 流可以有效地处理大规模数据,并且使用 NGINX 和 Node 的集群模块进行扩展可确保您的应用程序可以管理大流量。这些技术共同实现了强大的高性能实时应用程序。

    版本声明 本文转载于:https://dev.to/imsushant12/websockets-socketio-and-real-time-communication-with-nodejs-4ea0?1如有侵犯,请联系[email protected]删除
    最新教程 更多>
    • #daysofMiva 编码挑战日:JS 中的值和变量
      #daysofMiva 编码挑战日:JS 中的值和变量
      嗨,大家好。最近太忙了,都没有时间记录一下我的旅程是怎样的?无论如何,我会继续关注❤️。 对于我的第 5 天文档,我只是做了一些非常简单和简短的事情。 正如您从上面看到的,一旦您理解了值和变量,这就是一个非常简单的任务。 那么什么是值和变量? JavaScript 中的值 将值...
      编程 发布于2024-11-07
    • 您需要了解的 Python 4 关键特性
      您需要了解的 Python 4 关键特性
      Spotify、Google、NASA 和摩根大通有什么共同点?他们每天都使用Python。 Python 是一种令人印象深刻且全面的编程语言,在各种技术方法中发挥着至关重要的作用。从搜索引擎、网络应用程序、游戏到动画和其他编程语言,Python 都是发明的核心。 多年来,Python 经历了流行...
      编程 发布于2024-11-07
    • MySQL如何实现乐观锁?
      MySQL如何实现乐观锁?
      MySQL 中的乐观锁:全面解释乐观锁是数据库管理系统中采用的一种技术,用于防止在以下情况下可能出现的数据冲突:多个用户尝试同时更新相同的数据。虽然 MySQL 本身不支持乐观锁定,但可以使用标准 SQL 指令来实现。理解概念乐观锁定的操作假设数据不可能被多个用户频繁修改。该技术不是获取数据锁,而是...
      编程 发布于2024-11-07
    • 如何从 C++ 中的函数安全地返回数组?
      如何从 C++ 中的函数安全地返回数组?
      从 C 中的函数返回数组 尝试从 C 中的函数返回数组可能会导致意外行为,如以下代码所示片段:int* uni(int *a,int *b) { int c[10]; ... return c; }此函数尝试从函数返回本地数组 c。但是,当函数返回时,数组占用的内存将被释放,...
      编程 发布于2024-11-07
    • HTML5中如何将表格属性迁移到CSS?
      HTML5中如何将表格属性迁移到CSS?
      HTML5 表格属性转换Visual Studio 的 HTML5 验证功能将单元格填充、单元格间距、valign 和对齐属性标识为对表格元素无效。为了解决这个问题,HTML5 引入了 CSS 替代方案来控制表格的外观和间距。单元格填充:将 cellpadding 替换为应用于表格单元格的 CSS ...
      编程 发布于2024-11-07
    • 为什么不能在 C++ 中使用非常量变量定义数组大小?
      为什么不能在 C++ 中使用非常量变量定义数组大小?
      了解使用 Const Int 作为数组大小的限制在 C 中,使用 const int 作为数组大小受到以下限制某些限制。让我们深入研究一下为什么存在这些限制。考虑以下场景:允许:const int size = 2; int array[size] = {0}; // Compilation suc...
      编程 发布于2024-11-07
    • 如何在 MySQL WHERE 子句中指定不明确的“user_id”列?
      如何在 MySQL WHERE 子句中指定不明确的“user_id”列?
      解决 MySQL 'user_id' WHERE 子句中的歧义当处理共享列名的多个表时,MySQL 在使用时可能会遇到歧义WHERE 子句中的该列。这在错误消息“user_id”中很明显,其中 where 子句不明确。考虑示例查询:SELECT user.*, user_info.*...
      编程 发布于2024-11-07
    • 如何从 Pandas 中的函数高效创建多个新列?
      如何从 Pandas 中的函数高效创建多个新列?
      使用 Pandas 从函数创建多个新列在 Pandas 中,您可能会遇到需要根据应用于某个函数的自定义函数创建多个新列的情况现有专栏。该任务可能看起来很简单,但由于函数的预期返回类型,可能会出现意想不到的挑战。原始方法:分配给索引范围最初,您可能会尝试分配使用 df.ix[: ,10:16] = d...
      编程 发布于2024-11-07
    • 如何在 Go 中迭代地从切片中删除元素?
      如何在 Go 中迭代地从切片中删除元素?
      迭代地从切片中删除元素迭代切片时,由于移动而在循环中删除元素可能会很棘手后续元素。一种常见的错误方法是使用追加来删除元素,如下例所示:a := []string{"abc", "bbc", "aaa", "aoi", &...
      编程 发布于2024-11-07
    • 如何有效防止 C++ 中的内存泄漏:综合指南
      如何有效防止 C++ 中的内存泄漏:综合指南
      避免 C 中的内存泄漏:综合指南C 内存管理可能是一项艰巨的任务,潜在的内存泄漏潜伏在每个角落。为了减轻这些风险,必须遵循一组最佳实践。防止内存泄漏的一般技巧了解所有权: 确定谁负责释放内存。实施适当的清理机制以及时释放分配的资源。使用智能指针:考虑使用智能指针,例如 std::unique_ptr...
      编程 发布于2024-11-07
    • 使用html css和js的动画进行冒泡排序
      使用html css和js的动画进行冒泡排序
      代码 : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=d...
      编程 发布于2024-11-07
    • 理解 Go eBPF:深入探讨高效的内核级编程
      理解 Go eBPF:深入探讨高效的内核级编程
      扩展伯克利数据包过滤器 (eBPF) 彻底改变了 Linux 内核可观察性、性能监控和安全性。 eBPF 允许开发人员直接在内核中运行沙盒程序,而无需修改内核代码,从而释放有效监视、跟踪和操作数据的能力。与以其简单性、并发性和强大生态系统而闻名的 Go ebpf 编程语言相结合,eBPF 成为构建...
      编程 发布于2024-11-07
    • 为什么 `__init__` 方法对于 Python 类至关重要?
      为什么 `__init__` 方法对于 Python 类至关重要?
      为什么在 Python 类中使用 init?在 Python 中初始化类是一个基本概念,它允许您创建具有特定属性和行为的类的实例。 init方法充当类的构造函数,为新对象提供初始化和配置。理解类和对象这很重要区分类(对象的蓝图)和对象(这些类的实例)。类定义其对象将继承的属性和方法。从类创建对象时,...
      编程 发布于2024-11-07
    • NextJS 应用程序的 Docker 和 Docker-Compose 最佳实践。
      NextJS 应用程序的 Docker 和 Docker-Compose 最佳实践。
      Best Practices of Docker & Docker-Compose for NextJS application. To create an optimized Dockerfile for a Next.js 14 application that sup...
      编程 发布于2024-11-07
    • 数据结构:创建自定义节点类
      数据结构:创建自定义节点类
      作为一名开发人员,掌握数据结构是一项至关重要的技能,可以释放您解决问题的潜力。虽然 Java 中的标准集合框架提供了坚实的基础,但有时您需要超越内置数据结构并创建自己的自定义解决方案。 在这篇文章中,我们将学习如何创建自定义节点类以及它们如何帮助您有效地解决各种问题。 DATA STRUCTURE...
      编程 发布于2024-11-07

    免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

    Copyright© 2022 湘ICP备2022001581号-3