Fundamentos de TCP
Conecte-se e envie dados.
Fundamentos de TCP é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
O Que é LuaSocket
LuaSocket é a biblioteca de rede de fato para Lua. Ela expõe soquetes TCP e UDP brutos, além de auxiliares de nível mais alto para HTTP, SMTP e FTP.
É um módulo externo em C, portanto não faz parte do Lua padrão. Você o instala por meio de LuaRocks e o carrega com require.
Nenhum dos trechos deste curso é executado em um ambiente de testes simples, pois eles acessam a rede.
local socket = require("socket")
print(socket._VERSION)Criando um Soquete TCP
O objeto principal é o soquete mestre TCP, criado com socket.tcp(). Um soquete mestre recém-criado não está conectado nem associado a um endereço.
A partir de um mestre, você pode usar connect (transformando-o em um objeto cliente) ou bind+listen (transformando-o em um objeto servidor).
A maioria das chamadas retorna um valor ou nil junto com uma cadeia de erro, portanto sempre capture ambos.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endA Família de Endereços
O TCP funciona sobre IPv4 ou IPv6. socket.tcp() escolhe a família de forma tardia, enquanto socket.tcp4() e socket.tcp6() forçam uma delas.
Use socket.dns.toip(host) para resolver um nome de host para um endereço numérico antes de conectar, caso precise de controle explícito.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Conectando-se a um Host
conn:connect(host, port) executa a negociação de três vias do TCP. Em caso de sucesso, retorna 1; em caso de falha, retorna nil e uma mensagem de erro, como "connection refused" ou "timeout".
A função de conveniência socket.connect(host, port) cria um soquete e se conecta em uma única chamada.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endEnviando Dados
conn:send(data) grava bytes no soquete. Ela retorna o índice do último byte enviado. Com um soquete bloqueante, normalmente esse é o comprimento total de data.
O TCP é um fluxo de bytes, não um protocolo de mensagens, portanto um único send pode ser dividido ou combinado com outros durante a transmissão. Você precisa delimitar suas próprias mensagens.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Recebendo Dados
conn:receive(pattern) lê dados do fluxo. O padrão padrão "*l" lê uma linha sem a quebra de linha. "*a" lê até que a conexão seja fechada.
Você também pode passar um número para ler exatamente essa quantidade de bytes. Em caso de erro, a função retorna nil, uma cadeia de erro e todos os dados parciais recebidos.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Fechando a Conexão
Sempre chame conn:close() ao terminar para liberar o descritor de arquivo e enviar um TCP FIN.
Você pode fechar parcialmente com conn:shutdown("send") para sinalizar o fim do fluxo e continuar lendo a resposta do par. Isso é útil para protocolos de solicitação e resposta que usam "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()A Importância dos Tempos Limite
Por padrão, os soquetes bloqueiam indefinidamente. conn:settimeout(seconds) limita por quanto tempo uma chamada espera. O valor 0 torna o soquete não bloqueante.
Quando um tempo limite é atingido, a chamada retorna nil e a cadeia "timeout". Sempre defina um tempo limite em produção para evitar conexões travadas.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP versus UDP
TCP é orientado a conexão, ordenado e confiável: os bytes chegam uma única vez e na ordem correta, ao custo de negociações e retransmissões.
UDP (socket.udp()) não é orientado a conexão e não é confiável, mas é leve e adequado para telemetria ou jogos. Este curso se concentra em TCP porque ele sustenta o HTTP.
Envios Parciais e Laços
Em soquetes não bloqueantes, send pode transmitir apenas parte da sua área de memória. Ele retorna nil, "timeout" e o índice do último byte gravado até então.
Um remetente robusto usa um laço, retomando no byte seguinte ao último enviado, até que toda a área de memória seja transmitida.
local i = 1
while i <= #data do
local sent, err, last = conn:send(data, i)
i = (sent or last) + 1
if err and err ~= "timeout" then break end
endInspecionando a Conexão
conn:getpeername() retorna o IP e a porta remotos, enquanto conn:getsockname() retorna a extremidade local. Isso ajuda no registro e na depuração.
conn:setoption("keepalive", true) e conn:setoption("tcp-nodelay", true) ajustam o comportamento do soquete subjacente.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Verificação Rápida
Teste sua compreensão da semântica de recebimento do TCP.
Recapitulação
Você conheceu o objeto mestre TCP do LuaSocket, aprendeu a criar, conectar, enviar, receber e fechar soquetes, e viu como os tempos limite e o meio-fechamento moldam o comportamento.
Lembre-se de que TCP é um fluxo de bytes, cada chamada pode retornar nil, err e um soquete de produção sempre define um tempo limite. Em seguida, você reunirá essas partes em um cliente funcional.
Perguntas Frequentes
A aula “Fundamentos de TCP” é grátis?
Sim — o texto completo de “Fundamentos de TCP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Fundamentos de TCP”?
Conecte-se e envie dados. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Fundamentos de TCP”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos de TCP
- Construindo um cliente
- Construindo um servidor
- Solicitações HTTP