📡 Socket Server

Sistema de Mensajería en Tiempo Real

🚀 Servidor iniciado el: 02/01/2026, 16:14:21

API REST + WebSockets • MySQL • Autenticación • Control de Acceso por IP

📚 Documentación de la API

🎯 Resumen

Este sistema permite enviar y recibir mensajes en tiempo real usando:

📤 Envío de Mensajes (API REST)

Endpoint:

POST /api/send

Headers requeridos:

Content-Type: application/json

Parámetros del Body:

Parámetro Tipo Requerido Descripción
canal string ✅ Sí Nombre del canal donde enviar el mensaje
evento string ✅ Sí Tipo de evento (ej: chat, notification)
mensaje any ✅ Sí Contenido del mensaje (string, object, array)
token_write string ✅ Sí Token de escritura del canal (16 caracteres)

Ejemplo de petición:

curl -X POST http://localhost:3000/api/send \ -H "Content-Type: application/json" \ -d '{ "canal": "mi-canal", "evento": "chat", "mensaje": "¡Hola mundo!", "token_write": "abcd1234efgh5678" }'

Respuesta exitosa (200):

{ "success": true, "message": "Mensaje enviado correctamente", "messageId": "1lx2y3z4a5b6c7d8", "timestamp": "2025-01-23T15:30:00.123Z", "canal": "mi-canal", "evento": "chat" }

Posibles errores:

// Error 400 - Validación { "success": false, "error": "Token de escritura debe tener exactamente 16 caracteres" } // Error 403 - Autorización { "success": false, "error": "Canal no encontrado o token de escritura inválido" }

📡 Recepción de Mensajes (WebSockets)

1. Conectar al servidor WebSocket:

// JavaScript (navegador) const socket = io('http://localhost:3000'); // Node.js const io = require('socket.io-client'); const socket = io('http://localhost:3000');

2. Suscribirse a un canal:

socket.emit('subscribe', { canal: 'mi-canal', token_read: '*' // o token específico de 16 caracteres });

3. Escuchar mensajes:

// Confirmación de suscripción socket.on('subscribed', (data) => { console.log('Suscrito al canal:', data.canal); }); // Recibir mensajes socket.on('message', (data) => { console.log('Mensaje recibido:', data); /* Estructura del mensaje: { canal: "mi-canal", evento: "chat", mensaje: "¡Hola mundo!", timestamp: "2025-01-23T15:30:00.123Z", id: "1lx2y3z4a5b6c7d8", source_ip: "192.168.1.100" } */ }); // Errores de suscripción socket.on('subscription_error', (data) => { console.error('Error:', data.error); });

4. Desuscribirse (opcional):

socket.emit('unsubscribe', { canal: 'mi-canal' });

Ejemplo completo HTML:

<!DOCTYPE html> <html> <head> <script src="/socket.io/socket.io.js"></script> </head> <body> <div id="messages"></div> <script> const socket = io(); // Suscribirse al canal socket.emit('subscribe', { canal: 'test-canal', token_read: '*' }); // Mostrar mensajes socket.on('message', (data) => { const div = document.createElement('div'); div.innerHTML = `<strong>${data.evento}:</strong> ${data.mensaje}`; document.getElementById('messages').appendChild(div); }); </script> </body> </html>

📋 Gestión de Canales

1 Crear cuenta: Visita /login e ingresa con Email autorizado. Se creará automáticamente.
2 Crear canal: Ve a "Mis Canales" desde el dashboard y crea un nuevo canal.
3 Obtener tokens: Cada canal tiene:
  • token_write: Para enviar mensajes (16 caracteres)
  • token_read: Para recibir mensajes (* = público)
4 Configurar IPs: Controla qué IPs pueden leer/escribir en tu canal.

Configuración de acceso:

Configuración token_read IPs permitidas Descripción
Canal público * * Cualquiera puede leer desde cualquier IP
Lectura privada token16chars * Requiere token pero desde cualquier IP
IP restringida * 192.168.1.100 Solo desde IPs específicas
Máxima seguridad token16chars 192.168.1.100 Requiere token E IP específica

💡 Ejemplos Prácticos

🐍 Python

import requests import json # Enviar mensaje url = "http://localhost:3000/api/send" data = { "canal": "python-canal", "evento": "automation", "mensaje": {"status": "running", "progress": 75}, "token_write": "tu_token_aqui___" } response = requests.post(url, json=data) print(response.json())

📱 React/JavaScript

import io from 'socket.io-client'; function ChatComponent() { const [socket, setSocket] = useState(null); const [messages, setMessages] = useState([]); useEffect(() => { const newSocket = io('http://localhost:3000'); setSocket(newSocket); // Suscribirse al canal newSocket.emit('subscribe', { canal: 'react-chat', token_read: '*' }); // Escuchar mensajes newSocket.on('message', (data) => { setMessages(prev => [...prev, data]); }); return () => newSocket.close(); }, []); const sendMessage = async (mensaje) => { await fetch('/api/send', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ canal: 'react-chat', evento: 'chat', mensaje, token_write: 'tu_token_aqui___' }) }); }; return ( <div> {messages.map(msg => ( <div key={msg.id}>{msg.mensaje}</div> ))} </div> ); }

🟢 Node.js

const io = require('socket.io-client'); const axios = require('axios'); // Cliente receptor const socket = io('http://localhost:3000'); socket.emit('subscribe', { canal: 'node-canal', token_read: '*' }); socket.on('message', (data) => { console.log('📨 Mensaje recibido:', data.mensaje); }); // Enviar mensaje cada 5 segundos setInterval(async () => { try { await axios.post('http://localhost:3000/api/send', { canal: 'node-canal', evento: 'heartbeat', mensaje: `Servidor activo: ${new Date().toISOString()}`, token_write: 'tu_token_aqui___' }); } catch (error) { console.error('Error enviando mensaje:', error.message); } }, 5000);

📱 PHP

<?php $url = "http://localhost:3000/api/send"; $data = array( "canal" => "php-canal", "evento" => "notification", "mensaje" => "Usuario registrado: " . $username, "token_write" => "tu_token_aqui___" ); $options = array( 'http' => array( 'header' => "Content-type: application/json\r\n", 'method' => 'POST', 'content' => json_encode($data) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); $response = json_decode($result, true); if ($response['success']) { echo "Mensaje enviado: " . $response['messageId']; } else { echo "Error: " . $response['error']; } ?>

⚠️ Notas Importantes

🔑 Seguridad de Tokens: Los tokens de escritura son como contraseñas. No los compartas públicamente y regéneralos periódicamente desde el panel de control.
🌐 Control de IPs: Por defecto, los canales aceptan conexiones desde cualquier IP (*). Puedes restringir el acceso a IPs específicas desde "Gestión de IPs".
📊 Monitoreo: Todas las operaciones se registran en logs. Los administradores pueden ver la actividad completa del sistema.

🔧 Solución de Problemas