0Pricing
Lua Academy · Aula

E/S sem bloqueio com luasocket

Use luasocket no modo sem bloqueio, integrado a um agendador de corrotinas.

E/S sem bloqueio com luasocket é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 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 é uma biblioteca Lua que fornece soquetes TCP/UDP e clientes HTTP, FTP e SMTP. Por padrão, ela é bloqueante; o modo não bloqueante habilita E/S assíncrona.

Instalando luasocket

Instale por meio do LuaRocks: luarocks install luasocket. Carregue-o no seu script.

local socket = require("socket")
local tcp = socket.tcp()

Criando um soquete TCP

Crie um soquete cliente TCP e conecte-o a um servidor.

local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))

Modo não bloqueante

Defina o soquete como não bloqueante com tcp:settimeout(0). As leituras e gravações retornam imediatamente com um erro de tempo limite se nenhum dado estiver pronto.

tcp:settimeout(0)  -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
  -- no data yet, try again later
elseif data then
  print("Got:", data)
end

Integração com corrotinas

Combine soquetes não bloqueantes com corrotinas: use yield quando os dados não estiverem prontos e retome a corrotina quando o seletor indicar que estão prontos.

local function readAsync(sock)
  while true do
    local data, err = sock:receive(1024)
    if data then return data end
    if err ~= "timeout" then error(err) end
    coroutine.yield()  -- let other tasks run
  end
end

socket.select

socket.select(readSet, writeSet, timeout) retorna conjuntos de soquetes prontos para E/S — a base de um ciclo de eventos adequado.

local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
  local data = s:receive(1024)
  -- handle data
end

Cliente HTTP

luasocket inclui um módulo HTTP de alto nível para solicitações simples.

local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)

Soquetes UDP

UDP não usa conexão. Use socket.udp() para comunicação baseada em datagramas.

local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()

Tempos limite

Defina um tempo limite com :settimeout(seconds). Um tempo limite de 0 é não bloqueante; um número positivo permite bloqueio parcial; um valor nulo significa bloquear indefinidamente.

Padrão de tratamento de erros

As funções do luasocket retornam um valor nulo e uma mensagem de erro quando falham. Verifique sempre o segundo valor retornado.

local ok, err = tcp:connect("host", 80)
if not ok then
  error("Connection failed: " .. tostring(err))
end

Alternativa ao OpenResty

Para E/S não bloqueante de produção em LuaJIT, os soquetes cooperativos do OpenResty são muito mais capazes e eficientes. Use luasocket para scripts independentes e ferramentas simples.

Pergunta sobre modo não bloqueante

O que tcp:settimeout(0) faz?

Recapitulação: E/S não bloqueante

Use settimeout(0) para soquetes não bloqueantes e socket.select para multiplexação de E/S. Combine isso com corrotinas: use yield quando ocorrer um tempo limite e retome quando os dados estiverem prontos. Para E/S assíncrona de alto desempenho, prefira OpenResty ou luv.

Perguntas Frequentes

A aula “E/S sem bloqueio com luasocket” é grátis?

Sim — o texto completo de “E/S sem bloqueio com luasocket” é 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 “E/S sem bloqueio com luasocket”?

Use luasocket no modo sem bloqueio, integrado a um agendador de corrotinas. 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 4 de 4.

Quanto tempo leva a aula “E/S sem bloqueio com luasocket”?

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

  1. Criando um laço de eventos simples
  2. Async/await com corrotinas
  3. Padrões semelhantes a promessas
  4. E/S sem bloqueio com luasocket
← Voltar para Lua Academy