E/S no bloqueante con luasocket
Utilice luasocket en modo no bloqueante, integrado con un planificador de coroutines.
E/S no bloqueante con luasocket es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué es luasocket?
luasocket es una biblioteca de Lua que proporciona sockets TCP/UDP y clientes HTTP, FTP y SMTP. De forma predeterminada, funciona de manera bloqueante; el modo no bloqueante permite realizar E/S asíncrona.
Instalación de luasocket
Instálelo mediante LuaRocks: luarocks install luasocket. Requiéralo en el script.
local socket = require("socket")
local tcp = socket.tcp()Creación de un socket TCP
Cree un socket cliente TCP y conéctelo a un 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 no bloqueante
Configure el socket como no bloqueante mediante tcp:settimeout(0). Las lecturas y escrituras devuelven el resultado inmediatamente con un error de tiempo de espera si no hay datos disponibles.
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)
endIntegración con corrutinas
Combine sockets no bloqueantes con corrutinas: ceda la ejecución cuando los datos no estén disponibles y reanude la corrutina cuando el selector indique que el socket está listo.
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
endsocket.select
socket.select(readSet, writeSet, timeout) devuelve conjuntos de sockets listos para E/S; es la base de un bucle de eventos adecuado.
local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
local data = s:receive(1024)
-- handle data
endCliente HTTP
luasocket incluye un módulo HTTP de alto nivel para realizar solicitudes sencillas.
local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)Sockets UDP
UDP no requiere conexión. Utilice socket.udp() para la comunicación basada en datagramas.
local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()Tiempos de espera
Establezca un tiempo de espera mediante :settimeout(seconds). Un tiempo de espera de 0 es no bloqueante; un número positivo permite un bloqueo parcial; nil significa bloquear indefinidamente.
Patrón de manejo de errores
Las funciones de luasocket devuelven nil y una cadena de error cuando fallan. Compruebe siempre el segundo valor devuelto.
local ok, err = tcp:connect("host", 80)
if not ok then
error("Connection failed: " .. tostring(err))
endAlternativa: OpenResty
Para realizar E/S no bloqueante en producción con LuaJIT, los cosockets de OpenResty son mucho más completos y eficientes. Utilice luasocket para scripts independientes y herramientas sencillas.
Pregunta sobre el modo no bloqueante
¿Qué hace tcp:settimeout(0)?
Repaso: E/S no bloqueante
Utilice settimeout(0) para sockets no bloqueantes y socket.select para multiplexar la E/S. Combínelos con corrutinas: ceda la ejecución cuando se produzca un tiempo de espera y reanúdela cuando los datos estén disponibles. Para E/S asíncrona de alto rendimiento, prefiera OpenResty o luv.
Preguntas frecuentes
¿La lección «E/S no bloqueante con luasocket» es gratis?
Sí — el texto completo de «E/S no bloqueante con luasocket» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «E/S no bloqueante con luasocket»?
Utilice luasocket en modo no bloqueante, integrado con un planificador de coroutines. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «E/S no bloqueante con luasocket»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Construcción de un bucle de eventos sencillo
- Async/await con coroutines
- Patrones similares a Promise
- E/S no bloqueante con luasocket