Módulo WS
El módulo ws proporciona funcionalidades para comunicación bidireccional en tiempo real a través del protocolo WebSocket. Este módulo es útil para scripts que necesiten conectarse a servicios que utilicen WebSockets.
Características principales:
-
Conexión WebSocket asíncrona
-
Envío y recepción de mensajes de texto
-
Soporte para URLs seguras (wss://) y no seguras (ws://)
-
Timeout implícito basado en el sistema
Protocolo WebSocket:
-
Protocolo de comunicación full-duplex sobre una única conexión TCP
-
Ideal para aplicaciones en tiempo real
-
Soportado por la mayoría de los navegadores y servidores modernos
-
Menor overhead comparado con HTTP polling
Funciones Disponibles
Sección titulada «Funciones Disponibles»1. ws.send_recv(url, dados)
Sección titulada «1. ws.send_recv(url, dados)»Establece una conexión WebSocket, envía un mensaje y espera una respuesta.
Parámetros
Sección titulada «Parámetros»-
url (string): URL del servidor WebSocket (ej.: “ws://exemplo.com/socket”, “wss://exemplo.com/ws”)
-
dados (string): Mensaje de texto que se enviará al servidor
Retorno
Sección titulada «Retorno»- string: Respuesta de texto recibida del servidor WebSocket
Comportamiento
Sección titulada «Comportamiento»-
Establece conexión WebSocket con el servidor especificado
-
Envía el mensaje de texto proporcionado
-
Espera una respuesta del servidor
-
Devuelve el primer mensaje de texto recibido
-
Cierra la conexión después de recibir la respuesta
-
Lanza error si recibe mensaje binario o si no hay respuesta
Erros Comuns
Sección titulada «Erros Comuns»-
"ws binary messages not supported"- Servidor envió mensaje binario (no soportado) -
"no response from web socket"- Servidor no respondió -
Errores de conexión (servidor offline, URL inválida, etc.)
Ejemplo de Uso
Sección titulada «Ejemplo de Uso»-- Conexão básica com servidor WebSocketlocal url = "ws://echo.websocket.org"local mensagem = "Olá, WebSocket!"local resposta = ws.send_recv(url, mensagem)print("Resposta do servidor:", resposta)-- Saída: "Olá, WebSocket!" (servidor echo)
-- Conexão segura (wss://)local url_segura = "wss://servidor.producao.com/ws"local dados = json.encode({acao = "ping", timestamp = now()})local resposta = ws.send_recv(url_segura, dados)print("Resposta segura:", resposta)
-- Com tratamento de erro usando with_coroutinelocal function enviar_com_tratamento(url, dados) -- with_coroutine retorna (result, err) local resposta, err = with_coroutine(ws.send_recv, url, dados) if not err then return resposta else log.error("Erro no WebSocket:", err) return nil endend
-- Testar múltiplos servidoreslocal servidores = { "ws://servidor1.com/ws", "ws://servidor2.com/socket", "ws://backup.servidor.com/ws"}
for _, servidor in ipairs(servidores) do local resposta = enviar_com_tratamento(servidor, "ping") if resposta then print("Servidor", servidor, "respondendo") break endendInformación adicional
Sección titulada «Información adicional»Conexión segura (wss://)
Sección titulada «Conexión segura (wss://)»-- O módulo suporta tanto ws:// quanto wss://local conexoes = { "ws://localhost:8080/ws", -- Não seguro (HTTP) "wss://servidor.com/ws", -- Seguro (HTTPS) "ws://192.168.1.100:3000/ws", -- Local network}
for _, url in ipairs(conexoes) do -- with_coroutine retorna (result, err) local resposta, err = with_coroutine(ws.send_recv, url, "ping") if not err then print("Conexão bem-sucedida:", url) else print("Falha na conexão:", url, "-", err) endendSolo mensajes de texto
Sección titulada «Solo mensajes de texto»-- O módulo só suporta mensagens de texto-- Mensagens binárias retornam erro
local function enviar_dados_seguros(url, dados) -- Converter dados para JSON (texto) local dados_json = json.encode(dados)
local resposta = ws.send_recv(url, dados_json)
-- Parsear resposta JSON return json.decode(resposta)end
-- Exemplo com dados complexoslocal dados_complexos = { usuarios = { {id = 1, nome = "Alice", ativo = true}, {id = 2, nome = "Bob", ativo = false} }, metricas = { cpu = 45.6, memoria = 78.3, timestamp = now() }}
local resposta = enviar_dados_seguros("wss://api.empresa.com/ws", dados_complexos)