Saída:

Quando o servidor estiver em execução e você abrir o arquivo HTML em vários navegadores, as mensagens digitadas em um navegador serão enviadas ao servidor e transmitidas para todos os clientes conectados.

Fluxos Node.js.

Streams são essenciais para lidar com arquivos grandes ou dados em pedaços, em vez de carregar todo o conteúdo na memória. Eles são úteis para:

Tipos de fluxos em Node.js:

  1. Fluxos legíveis: Fluxos a partir dos quais os dados podem ser lidos (por exemplo, leitura do sistema de arquivos).
  2. Streams graváveis: Streams nos quais os dados podem ser gravados (por exemplo, gravação do sistema de arquivos).
  3. Duplex Streams: Streams que podem ser lidos e gravados (por exemplo, soquetes TCP).
  4. Transform Streams: Streams que podem modificar ou transformar dados à medida que são gravados e lidos (por exemplo, compactação de arquivo).

Exemplo: lendo um arquivo usando streams

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\\');});

Dimensionando aplicativos Node.js

À medida que seu aplicativo cresce, o dimensionamento se torna necessário para lidar com o aumento do tráfego e garantir alta disponibilidade. Os aplicativos Node.js podem ser dimensionados verticalmente ou horizontalmente:

Módulo Cluster em Node.js

Node.js é executado em um único thread, mas usando o módulo cluster, você pode aproveitar as vantagens de sistemas multi-core executando vários processos 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);}

Conclusão

WebSockets e Socket.IO oferecem comunicação bidirecional em tempo real, essencial para aplicativos da web modernos. Os fluxos Node.js lidam com eficiência com dados em grande escala, e o dimensionamento com NGINX e o módulo de cluster do Node garante que seu aplicativo possa gerenciar tráfego pesado. Juntas, essas tecnologias permitem aplicações em tempo real robustas e de alto desempenho.

","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"}}
"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > WebSockets, Socket.IO e comunicação em tempo real com Node.js

WebSockets, Socket.IO e comunicação em tempo real com Node.js

Publicado em 2024-11-02
Navegar:519

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

A comunicação em tempo real se tornou um recurso importante dos aplicativos modernos, permitindo atualizações instantâneas, troca de dados ao vivo e experiências de usuário responsivas. Tecnologias como WebSockets e Socket.IO estão na vanguarda das interações em tempo real. Este artigo irá se aprofundar nos conceitos de WebSockets, como implementá-los em Node.js e como Socket.IO simplifica a comunicação em tempo real.

O que é WebSocket?

WebSocket é um protocolo de comunicação que fornece canais de comunicação full-duplex em uma única conexão TCP. Ao contrário do protocolo HTTP, que opera em um modelo solicitação-resposta, o WebSocket permite que o servidor e o cliente enviem mensagens entre si a qualquer momento, mantendo uma conexão aberta.

Principais características:

  • Conexão persistente: WebSocket mantém a conexão aberta, reduzindo a necessidade de restabelecer conexões.
  • Comunicação bidirecional: Tanto o servidor quanto o cliente podem enviar mensagens livremente.
  • Baixa Latência: Como o WebSocket mantém uma conexão aberta, ele elimina a sobrecarga de solicitações HTTP, reduzindo a latência.

Quando usar WebSockets?

WebSockets são ideais para aplicações que exigem troca de dados em tempo real e de baixa latência:

  • Aplicativos de bate-papo (por exemplo, Slack, WhatsApp Web)
  • Atualizações de esportes ao vivo
  • Feeds do mercado de ações
  • Ferramentas de colaboração em tempo real (por exemplo, Google Docs)

Configurando WebSocket em Node.js

Node.js suporta nativamente WebSocket por meio do pacote ws, uma biblioteca leve e eficiente para comunicação WebSocket.

Etapa 1: Instale o pacote WebSocket

npm install ws

Etapa 2: Crie um servidor 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');

Explicação:

  • Um servidor WebSocket escuta na porta 8080.
  • O evento de conexão é acionado quando um cliente se conecta.
  • O evento de mensagem é acionado quando o servidor recebe dados do cliente, que então ecoam de volta.

Etapa 3: Crie um cliente 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');
});

Saída:

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

O que é Socket.IO?

Socket.IO é uma biblioteca popular construída sobre WebSockets que simplifica a comunicação em tempo real. Ele fornece uma abstração de nível superior, facilitando a implementação e o gerenciamento de eventos em tempo real. Socket.IO também suporta mecanismos de fallback para navegadores que não suportam WebSockets, garantindo ampla compatibilidade.

Vantagens do Socket.IO:

  • Reconexão automática: Tenta reconectar automaticamente se a conexão for perdida.
  • Namespace e salas: organiza conexões em namespaces e salas, permitindo uma comunicação mais estruturada.
  • Modelo orientado a eventos: Suporta eventos personalizados, tornando a comunicação mais semântica.

Usando Socket.IO com Node.js

Etapa 1: instalar o Socket.IO

npm install socket.io

Etapa 2: configurar um servidor 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');
});

Explicação:

  • Um servidor HTTP é criado e Socket.IO é anexado a ele.
  • O evento de conexão lida com novas conexões de clientes.
  • O evento de chat é um evento personalizado para envio de mensagens de chat e emite transmissões das mensagens para todos os clientes.

Etapa 3: Crie um cliente Socket.IO



    Socket.IO Chat
    

    Saída:

    Quando o servidor estiver em execução e você abrir o arquivo HTML em vários navegadores, as mensagens digitadas em um navegador serão enviadas ao servidor e transmitidas para todos os clientes conectados.

    Fluxos Node.js.

    Streams são essenciais para lidar com arquivos grandes ou dados em pedaços, em vez de carregar todo o conteúdo na memória. Eles são úteis para:

    • Uploads/downloads de arquivos: os streams permitem que você processe dados à medida que eles são carregados ou baixados.
    • Tratamento de dados grandes: Streams são mais eficientes em termos de memória para lidar com arquivos grandes ou dados contínuos.

    Tipos de fluxos em Node.js:

    1. Fluxos legíveis: Fluxos a partir dos quais os dados podem ser lidos (por exemplo, leitura do sistema de arquivos).
    2. Streams graváveis: Streams nos quais os dados podem ser gravados (por exemplo, gravação do sistema de arquivos).
    3. Duplex Streams: Streams que podem ser lidos e gravados (por exemplo, soquetes TCP).
    4. Transform Streams: Streams que podem modificar ou transformar dados à medida que são gravados e lidos (por exemplo, compactação de arquivo).

    Exemplo: lendo um arquivo usando streams

    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');
    });
    

    Dimensionando aplicativos Node.js

    À medida que seu aplicativo cresce, o dimensionamento se torna necessário para lidar com o aumento do tráfego e garantir alta disponibilidade. Os aplicativos Node.js podem ser dimensionados verticalmente ou horizontalmente:

    • Escalonamento vertical: Aumentando os recursos (CPU, RAM) de uma única máquina.
    • Escalonamento horizontal: execução de várias instâncias de seu aplicativo Node.js em diferentes máquinas ou núcleos.

    Módulo Cluster em Node.js

    Node.js é executado em um único thread, mas usando o módulo cluster, você pode aproveitar as vantagens de sistemas multi-core executando vários processos 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);
    }
    

    Conclusão

    WebSockets e Socket.IO oferecem comunicação bidirecional em tempo real, essencial para aplicativos da web modernos. Os fluxos Node.js lidam com eficiência com dados em grande escala, e o dimensionamento com NGINX e o módulo de cluster do Node garante que seu aplicativo possa gerenciar tráfego pesado. Juntas, essas tecnologias permitem aplicações em tempo real robustas e de alto desempenho.

    Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/imsushant12/websockets-socketio-and-real-time-communication-with-nodejs-4ea0?1 Se houver alguma violação, entre em contato com [email protected] para excluir isto
    Tutorial mais recente Mais>

    Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

    Copyright© 2022 湘ICP备2022001581号-3