Módulo WS
O módulo ws fornece funcionalidades para comunicação bidirecional em tempo real através do protocolo WebSocket. Este módulo é útil para scripts que precisam se conectar a serviços que utilizam WebSockets.
Características principais:
- Conexão WebSocket assíncrona
- Envio e recebimento de mensagens de texto
- Suporte a URLs seguras (wss://) e não seguras (ws://)
- Timeout implícito baseado no sistema
Protocolo WebSocket:
- Protocolo de comunicação full-duplex sobre uma única conexão TCP
- Ideal para aplicações em tempo real
- Suportado pela maioria dos navegadores e servidores modernos
- Menor overhead comparado a HTTP polling
Funções Disponíveis
1. ws.send_recv(url, dados)
Estabelece uma conexão WebSocket, envia uma mensagem e aguarda uma resposta.
Parâmetros:
- url (string): URL do servidor WebSocket (ex: "ws://exemplo.com/socket", "wss://exemplo.com/ws")
- dados (string): Mensagem de texto a ser enviada para o servidor
Retorno:
- string: Resposta de texto recebida do servidor WebSocket
Comportamento:
- Estabelece conexão WebSocket com o servidor especificado
- Envia a mensagem de texto fornecida
- Aguarda uma resposta do servidor
- Retorna a primeira mensagem de texto recebida
- Fecha a conexão após receber a resposta
- Lança erro se receber mensagem binária ou se não houver resposta
Erros Comuns:
-
"ws binary messages not supported"- Servidor enviou mensagem binária (não suportada) -
"no response from web socket"- Servidor não respondeu - Erros de conexão (servidor offline, URL inválida, etc.)
Exemplo de Uso:
-- Conexão básica com servidor WebSocket
local 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
local function enviar_com_tratamento(url, dados)
local ok, resposta = pcall(ws.send_recv, url, dados)
if ok then
return resposta
else
log.error("Erro no WebSocket:", resposta)
return nil
end
end
-- Testar múltiplos servidores
local 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
end
end
Informações Adicionais
Conexão 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
local ok, resposta = pcall(ws.send_recv, url, "ping")
if ok then
print("Conexão bem-sucedida:", url)
else
print("Falha na conexão:", url, "-", resposta)
end
end
Mensagens de Texto Apenas:
-- 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 complexos
local 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)