Programação de Rede em TypeScript: de Sockets a WebSocket
\n\nQuando falamos sobre programação de rede em TypeScript, muitas vezes imaginamos sistemas distribuídos complexos, chats em tempo real ou servidores de jogos. E não é por acaso: o TypeScript, com sua tipagem estrita e recursos de análise estática, torna o desenvolvimento de aplicações de rede não apenas seguro, mas verdadeiramente conveniente.
\n\nNeste artigo, vamos explorar como criar aplicações cliente-servidor em TypeScript, usando os módulos internos do Node.js — net e dgram — bem como bibliotecas para trabalhar com WebSocket. Você obterá exemplos de código prontos que podem ser aplicados imediatamente em projetos.
Por que TypeScript para programação de rede?
\n\nMuitos desenvolvedores estão acostumados a usar JavaScript para backend, mas a programação de rede em TypeScript oferece várias vantagens:
\n\n- \n
- Tipagem de dados — você define antecipadamente a estrutura dos pacotes e mensagens \n
- Autocompletar — a IDE sugere métodos de sockets e seus parâmetros \n
- Menos erros — o compilador detecta incompatibilidades de tipos antes da execução \n
Vamos ver um exemplo real. Imagine que estamos escrevendo um servidor TCP. Em JavaScript, você escreveria:
\n\nconst server = require('net').createServer(socket => {\n socket.on('data', data => {\n // data — é um Buffer, é preciso lembrar disso\n });\n});\n\nEm TypeScript, obtemos tipos claros:
\n\nimport * as net from 'net';\n\nconst server: net.Server = net.createServer((socket: net.Socket) => {\n socket.on('data', (data: Buffer) => {\n // O tipo Buffer é conhecido, trabalhamos com confiança\n });\n});\n\nParece um detalhe, mas em grandes projetos essa diferença economiza horas de depuração.
\n\nFundamentos: Servidor e Cliente TCP em TypeScript
\n\nVamos começar com o clássico — TCP. Criaremos um simples servidor eco, que retorna ao cliente o que recebeu.
\n\nServidor TCP
\n\nimport * as net from 'net';\n\nconst PORT: number = 3000;\nconst HOST: string = '127.0.0.1';\n\nconst server: net.Server = net.createServer((socket: net.Socket) => {\n console.log(`Cliente conectado: ${socket.remoteAddress}:${socket.remotePort}`);\n\n socket.on('data', (data: Buffer) => {\n const message: string = data.toString().trim();\n console.log(`Recebido: ${message}`);\n socket.write(`Eco: ${message}\\n`);\n });\n\n socket.on('end', () => {\n console.log('Cliente desconectado');\n });\n\n socket.on('error', (err: Error) => {\n console.error('Erro no socket:', err.message);\n });\n});\n\nserver.listen(PORT, HOST, () => {\n console.log(`Servidor TCP iniciado em ${HOST}:${PORT}`);\n});\n\nObserve: tipificamos todas as variáveis — server, socket, data, err. Isso nos permite ver quais métodos estão disponíveis no socket e evitar erros acidentais.
Cliente TCP
\n\nimport * as net from 'net';\n\nconst client: net.Socket = new net.Socket();\n\nclient.connect(3000, '127.0.0.1', () => {\n console.log('Conectado ao servidor');\n client.write('Olá, servidor!');\n});\n\nclient.on('data', (data: Buffer) => {\n console.log('Resposta do servidor:', data.toString());\n client.destroy();\n});\n\nclient.on('close', () => {\n console.log('Conexão fechada');\n});\n\nEste código pode ser executado em qualquer projeto Node.js com TypeScript. Basta instalar @types/node e compilar.
UDP: quando a velocidade é mais importante que a confiabilidade
\n\nSe você precisa transmitir dados sem estabelecer conexão (por exemplo, para streaming ou jogos), use sockets UDP em TypeScript. O módulo dgram fornece tudo o que é necessário.
Servidor UDP
\n\nimport * as dgram from 'dgram';\n\nconst server: dgram.Socke