Conceptos básicos de TCP
Conéctese y envíe datos
Conceptos básicos de TCP es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 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 la biblioteca de redes de facto para Lua. Expone sockets TCP y UDP de bajo nivel, además de utilidades de nivel superior para HTTP, SMTP y FTP.
Es un módulo externo escrito en C, por lo que no forma parte de Lua estándar. Se instala mediante LuaRocks y se carga con require.
Ninguno de los fragmentos de este curso se ejecuta en un entorno de pruebas básico porque acceden a la red.
local socket = require("socket")
print(socket._VERSION)Crear un socket TCP
El objeto principal es el socket maestro TCP, creado con socket.tcp(). Un socket maestro nuevo no está conectado ni asociado a ninguna dirección.
Desde un socket maestro puede usar connect para convertirlo en un objeto cliente, o bind+listen para convertirlo en un objeto servidor.
La mayoría de las llamadas devuelve un valor o bien nil junto con una cadena de error, así que capture siempre ambos.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endLa familia de direcciones
TCP funciona sobre IPv4 o IPv6. socket.tcp() elige la familia de forma diferida, mientras que socket.tcp4() y socket.tcp6() fuerzan una familia concreta.
Use socket.dns.toip(host) para resolver un nombre de host a una dirección numérica antes de conectarse si necesita un control explícito.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Conectarse a un host
conn:connect(host, port) realiza el protocolo de enlace TCP de tres pasos. Si tiene éxito, devuelve 1; si falla, devuelve nil y un mensaje de error como "connection refused" o "timeout".
La función de conveniencia socket.connect(host, port) crea un socket y se conecta en una sola llamada.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endEnviar datos
conn:send(data) escribe bytes en el socket. Devuelve el índice del último byte enviado. Con un socket bloqueante, normalmente corresponde a la longitud completa de data.
TCP es un flujo de bytes, no un protocolo de mensajes, por lo que un solo send puede dividirse o combinarse con otros datos durante la transmisión. Debe definir el encuadre de sus propios mensajes.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Recibir datos
conn:receive(pattern) lee del flujo. El patrón predeterminado "*l" lee una línea sin el salto de línea. "*a" lee hasta que se cierra la conexión.
También puede pasar un número para leer exactamente esa cantidad de bytes. En caso de error, devuelve nil, una cadena de error y cualquier parte de los datos que se haya recibido.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Cerrar la conexión
Llame siempre a conn:close() cuando termine para liberar el descriptor de archivo y enviar un FIN de TCP.
Puede realizar un cierre parcial con conn:shutdown("send") para indicar el final del flujo mientras continúa leyendo la respuesta del otro extremo. Esto resulta práctico para protocolos de solicitud y respuesta que utilizan "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()La importancia de los tiempos de espera
De forma predeterminada, los sockets se bloquean indefinidamente. conn:settimeout(seconds) limita cuánto tiempo espera una llamada. Un valor de 0 hace que el socket no sea bloqueante.
Cuando se agota el tiempo de espera, la llamada devuelve nil y la cadena "timeout". Establezca siempre un tiempo de espera en producción para evitar conexiones bloqueadas.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP frente a UDP
TCP está orientado a la conexión, mantiene el orden y es fiable: los bytes llegan una sola vez y en orden, a cambio de los handshakes y las retransmisiones.
UDP (socket.udp()) no requiere conexión y no es fiable, pero es ligero y adecuado para la telemetría o los juegos. Este curso se centra en TCP porque es la base de HTTP.
Envíos parciales y bucles
En los sockets no bloqueantes, send puede transmitir solo una parte de su búfer. Devuelve nil, "timeout" y el índice del último byte escrito hasta ese momento.
Un emisor robusto usa un bucle y reanuda el envío desde el byte posterior al último enviado hasta vaciar todo el búfer.
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
endInspección de la conexión
conn:getpeername() devuelve la IP y el puerto remotos, mientras que conn:getsockname() devuelve los datos del extremo local. Esto resulta útil para registrar información y depurar.
conn:setoption("keepalive", true) y conn:setoption("tcp-nodelay", true) ajustan el comportamiento del socket subyacente.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Comprobación rápida
Compruebe su comprensión de la semántica de recepción de TCP.
Resumen
Ha conocido el objeto maestro TCP de LuaSocket, ha aprendido a crear, conectar, usar y cerrar sockets, y ha visto cómo los tiempos de espera y el cierre parcial determinan el comportamiento.
Recuerde que TCP es un flujo de bytes, que cada llamada puede devolver nil, err y que un socket en producción siempre debe configurar un tiempo de espera. A continuación ensamblará estas piezas para crear un cliente funcional.
Preguntas frecuentes
¿La lección «Conceptos básicos de TCP» es gratis?
Sí — el texto completo de «Conceptos básicos de TCP» 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 «Conceptos básicos de TCP»?
Conéctese y envíe datos 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 1 de 4.
¿Cuánto tiempo toma la lección «Conceptos básicos de TCP»?
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
- Conceptos básicos de TCP
- Crear un cliente
- Crear un servidor
- Solicitudes HTTP