输出:

服务器运行后,您在多个浏览器中打开 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
瀏覽:976

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]刪除
    最新教學 更多>

    免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

    Copyright© 2022 湘ICP备2022001581号-3