Cómo configurar el JoinServer en tu servidor de MU Online
Entiende y configura el JoinServer de tu servidor de MU Online: su papel en party, guild y eventos cross-server, la definición de puerto, el registro de los GameServers y la conexión correcta entre JoinServer, GameServer y ConnectServer — con pruebas y solución de errores.
El JoinServer es una de las piezas más malentendidas de un servidor de MU Online — y, no por casualidad, una de las que más dolor de cabeza causa cuando algo "casi funciona": el jugador inicia sesión, ve la lista de servidores, elige un canal, pero se traba en el "conectando" o entra sin poder forma
El JoinServer es una de las piezas más malentendidas de un servidor de MU Online — y, no por casualidad, una de las que más dolor de cabeza causa cuando algo "casi funciona": el jugador inicia sesión, ve la lista de servidores, elige un canal, pero se traba en el "conectando" o entra sin poder formar party con quien está en otro GameServer. Este servicio es el intermediario que valida la sesión de login y cose la comunicación entre los varios GameServers de un mismo mundo. Configurado bien, es invisible; configurado mal, tumba party, guild y eventos cross-server sin dar un error claro. Este tutorial explica el papel del JoinServer, cómo configurarlo, cómo conectarlo al GameServer y al ConnectServer, y cómo probar cada punta.
Qué es el JoinServer
En el flujo de conexión de MU Online hay tres servicios de retaguardia que el jugador nunca ve directamente, pero de los cuales todo depende: ConnectServer, JoinServer y GameServer (además de la base de datos). El JoinServer queda en medio de esa cadena. Su función central es validar la sesión de login — cuando el jugador autentica la cuenta, es el JoinServer quien confirma que esa sesión es válida y la mantiene coherente mientras el jugador transita por el mundo. Además, centraliza datos de sesión que necesitan ser vistos por más de un GameServer al mismo tiempo.
Es esa centralización la que da al JoinServer el papel "cross-server": como todos los GameServers de un mismo mundo apuntan al mismo JoinServer, información como party, guild y ciertos eventos consigue ser reconocida entre canales diferentes. Sin él, cada GameServer sería una isla aislada.
El papel del JoinServer en party, guild y eventos
Vale detallar por qué tanto depende de él:
- Party entre canales: cuando dos jugadores están en GameServers distintos del mismo mundo, es el JoinServer quien reconoce la sesión de ambos y permite que la party se forme y se mantenga.
- Guild y alianzas: los datos de guild consultados por diferentes GameServers pasan por esta capa de sesión; si el JoinServer no está alineado, los miembros "desaparecen" de la guild al cambiar de canal.
- Eventos cross-server: los eventos que reúnen jugadores de canales diferentes (según el emulador) usan la coherencia de sesión del JoinServer para saber quién es quién.
- Estabilidad de la sesión: evita sesiones duplicadas y ayuda a tumbar logins fantasma, manteniendo coherente la base de "quién está en línea".
> Regla de oro: si un recurso funciona dentro de un GameServer pero se rompe entre GameServers, el JoinServer (o la ruta hacia él) es el primer lugar donde investigar.
Requisitos previos
- Servidor de MU ya instalado y corriendo localmente o en VPS (mira el tutorial de creación de servidor).
- Acceso a los archivos de configuración del JoinServer, del GameServer y del ConnectServer.
- La IP de la máquina donde correrá el JoinServer (127.0.0.1 si todo es local; IP interna/externa si es distribuido).
- Permiso para abrir puertos en el firewall de la máquina/VPS.
- Backup de los archivos de configuración antes de cualquier cambio.
Archivos y puertos involucrados
Los nombres de archivo y los puertos varían según el emulador (IGCN, MuEMU, X-Team y derivados). Trata los valores de abajo como ejemplos y consulta siempre el estándar de tu MuServer:
| Servicio | Archivo (ejemplo) | Puerto (ejemplo) | Función |
|---|---|---|---|
| ConnectServer | ConnectServer.ini / ServerList.dat | 44405 (cliente) | Entrega la lista de servidores y enruta al cliente |
| JoinServer | JoinServer.ini / JoinServerConfig | 55970 (interna) | Valida la sesión de login y sincroniza sesión entre GameServers |
| GameServer | GameServerInfo / GameServer.ini | 55901+ (cliente) | Ejecuta el mundo de juego; se conecta al JoinServer |
El puerto del JoinServer es casi siempre un puerto interno, usado en la conversación entre JoinServer y GameServer — no es el puerto en el que el cliente del juego se conecta. Esto es fuente constante de confusión: abrir solo el puerto del cliente y olvidar el interno hace que el servidor "arranque" pero los GameServers no conversen con el JoinServer.
Paso 1 — Localizar y abrir la configuración del JoinServer
- Ve a la carpeta de tu MuServer y localiza el ejecutable y el archivo de configuración del JoinServer (algo como
JoinServer.exe+JoinServer.ini, o una carpetaJoinServercon un archivo de config). - Abre el archivo de configuración en un editor de texto simple (Notepad++ es ideal — evita corromper el encoding).
- Identifica las claves principales: puerto de escucha, IP de bind y la lista/registro de GameServers que este JoinServer va a atender.
No todo emulador expone las tres cosas en el mismo archivo — en algunos, la lista de GameServers queda en un archivo separado (ServerList/GameServerList). Anota dónde está cada una.
Paso 2 — Definir el puerto y la IP de escucha
En el archivo del JoinServer, define el puerto interno y la IP de bind. Un bloque típico se parece a esto (el formato exacto varía según el emulador):
[JoinServer]
; IP en la que el JoinServer escucha. 0.0.0.0 = todas las interfaces
IPAddress = 0.0.0.0
; Puerto interno usado por los GameServers para conectar
Port = 55970
; Conexión con la base de datos de cuentas
DBServer = 127.0.0.1
DBName = MuOnline
- Usa
0.0.0.0en elIPAddresspara escuchar en todas las interfaces cuando los GameServers estén en máquinas diferentes; usa127.0.0.1si todo es local. - Anota el
Port— deberá ser idéntico en la configuración de cada GameServer. - Confirma los datos de base de datos: el JoinServer normalmente también toca la base de cuentas para validar la sesión.
Guarda el archivo manteniendo el encoding original (generalmente ANSI). Guardarlo como UTF-8 con BOM puede impedir que el servicio arranque.
Paso 3 — Registrar los GameServers en el JoinServer
Aquí reside el secreto del cross-server. El JoinServer necesita saber qué GameServers atiende. En muchos emuladores hay una lista así:
[GameServerList]
; Code = IP : Puerto
0 = 127.0.0.1:55901
1 = 127.0.0.1:55902
2 = 127.0.0.1:55903
- Cada línea corresponde a un GameServer (canal) del mismo mundo.
- El Code aquí debe coincidir con el código de servidor definido dentro de cada GameServer.
- Para que party y guild funcionen entre canales, todos los GameServers que deben compartir sesión necesitan estar en esta lista, apuntando al mismo JoinServer.
Si un GameServer no está en la lista (o está con IP/puerto equivocados), incluso arranca, pero queda "sordo" para el resto del mundo — los jugadores en él no forman party con los demás.
Paso 4 — Apuntar cada GameServer al JoinServer
Ahora cierra el ciclo del otro lado. En la configuración de cada GameServer, localiza las claves que apuntan al JoinServer y alinéalas con el Paso 2:
[GameServerInfo]
ServerCode = 0
; Dirección del JoinServer (misma máquina o IP interna)
JoinServerIP = 127.0.0.1
JoinServerPort = 55970
JoinServerIPyJoinServerPortdeben ser exactamente la IP y el puerto configurados en el JoinServer.ServerCodedebe corresponder al Code registrado en la lista del JoinServer (Paso 3).- Repite para todos los GameServers, cambiando solo el
ServerCode(y el puerto del cliente de cada uno).
Este es el error más común de todos: un GameServer apuntando a un puerto o IP diferente del JoinServer. Funciona aislado, pero rompe todo lo que es cross-server.
Paso 5 — Conectar al ConnectServer
El ConnectServer es la puerta de entrada del cliente: muestra la lista de servidores y encamina al jugador al GameServer elegido. El JoinServer no conversa directamente con el cliente, pero la cadena solo queda coherente si los tres están alineados:
- En el ConnectServer, confirma que la lista de servidores apunta a las IPs/puertos de cliente correctos de los GameServers.
- Garantiza que los
ServerCodeusados en el ConnectServer, en los GameServers y en la lista del JoinServer se refieran a los mismos servidores. - Orden de inicialización recomendado: base de datos → JoinServer → GameServers → ConnectServer. Levantar el GameServer antes del JoinServer suele generar error de conexión en el arranque.
Paso 6 — Abrir puertos en el firewall
Aun con todo correcto en los archivos, el firewall puede bloquear la conversación interna.
- Abre el puerto interno del JoinServer (ej.: 55970) para conexiones provenientes de los GameServers.
- Si el JoinServer y los GameServers están en máquinas diferentes, abre el puerto en el firewall de entrada de la máquina del JoinServer y garantiza ruta entre ellas.
- Abre también los puertos de cliente de los GameServers y del ConnectServer, para que el jugador se conecte.
- En VPS, recuerda que puede haber un firewall en el panel del proveedor además del firewall de Windows.
Paso 7 — Probar la cadena completa
- Inicia los servicios en el orden correcto y confirma, en las consolas, que cada GameServer reporta conexión exitosa con el JoinServer.
- Entra con una cuenta, mira la lista de servidores y conéctate a un canal — el login debe completarse sin trabarse en el "conectando".
- Entra con dos cuentas en GameServers diferentes del mismo mundo e intenta formar party. Si funciona, el cross-server está OK.
- Prueba guild: crea/entra en una guild y verifica si los miembros aparecen al cambiar de canal.
- Deja el servidor corriendo unos minutos y observa si hay desconexiones o reconexiones extrañas en los logs del JoinServer.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| Se traba en el "conectando" tras elegir servidor | El GameServer no se conecta al JoinServer | Confirma IP/puerto del JoinServer en el GameServer y el servicio en el aire |
| Party no funciona entre canales | GameServer fuera de la lista del JoinServer | Añade el GameServer a GameServerList con el Code correcto |
| Guild "desaparece" al cambiar de canal | ServerCode inconsistente entre servicios | Alinea el mismo ServerCode en JoinServer, GameServer y ConnectServer |
| El JoinServer no arranca | Puerto en uso o encoding del archivo | Cambia el puerto o guarda el config en ANSI; revisa otro proceso en el puerto |
| El GameServer da error de conexión en el arranque | Orden de inicialización equivocado | Levanta el JoinServer antes de los GameServers |
| Conecta local pero no por internet | Puerto bloqueado en el firewall/VPS | Abre el puerto interno y los de cliente en el firewall del SO y del proveedor |
Buenas prácticas de operación
- Documenta el mapa de puertos (JoinServer, cada GameServer, ConnectServer) en una planilla — ahorra horas de depuración futura.
- Mantén la lista de GameServers sincronizada siempre que agregues un canal nuevo: regístralo en el JoinServer, en el ConnectServer y ajusta el ServerCode.
- Monitorea los logs del JoinServer — caídas repetidas de conexión de un GameServer indican red, firewall o puerto en conflicto.
- Haz backup de los configs antes de cada cambio; un carácter equivocado tumba el servicio en el arranque.
Lista de verificación de configuración
- Puerto e IP de escucha del JoinServer definidos y anotados.
- Todos los GameServers del mundo registrados en la lista del JoinServer.
- Cada GameServer apuntando a la IP/puerto correctos del JoinServer.
- ServerCode consistente entre JoinServer, GameServers y ConnectServer.
- ConnectServer con la lista de servidores correcta.
- Puertos abiertos en el firewall del SO y del proveedor (si VPS).
- Orden de arranque respetado (DB → JoinServer → GameServers → ConnectServer).
- Party y guild probados entre GameServers diferentes.
Con el JoinServer alineado, tienes la columna vertebral de sesión de tu mundo funcionando — y la base para escalar. El siguiente paso natural es agregar nuevos GameServers (canales) reutilizando exactamente este mismo mapa: registrar el canal en la lista del JoinServer, apuntar el nuevo GameServer al mismo puerto interno y replicar el ServerCode en la cadena. Hecho una vez con cuidado, expandir se vuelve rutina.
Preguntas frecuentes
¿Qué hace exactamente el JoinServer?
Es el servicio intermediario que valida el login del jugador entre la cuenta y el mundo de juego, mantiene la sesión activa y coordina información que cruza GameServers, como party, guild y algunos eventos cross-server. Sin él en el aire, el jugador llega al ConnectServer pero no consigue entrar de hecho al mundo.
¿El JoinServer es lo mismo que el ConnectServer?
No. El ConnectServer entrega la lista de servidores y enruta el cliente al GameServer correcto; el JoinServer valida la sesión de login y sincroniza datos de sesión entre los GameServers. Trabajan juntos, pero son servicios distintos, con puertos y funciones diferentes.
¿Qué puerto usa el JoinServer?
Varía según el emulador. Un valor común es el puerto 55970 (interno, entre JoinServer y GameServer), pero cada emulador (IGCN, MuEMU, X-Team) tiene su estándar. Lo importante es que el puerto configurado en el JoinServer sea exactamente el mismo apuntado en cada GameServer.
¿Necesito un JoinServer por GameServer?
No. Un único JoinServer normalmente atiende a varios GameServers del mismo mundo, y es justamente eso lo que permite que party y guild funcionen entre canales/servidores. Cada GameServer apunta al mismo JoinServer por la IP y el puerto.
Party y guild no funcionan entre servidores — ¿puede ser el JoinServer?
Sí, es la sospecha número uno. Si dos GameServers no comparten party/guild, casi siempre uno de ellos apunta a un JoinServer diferente, a un puerto equivocado, o el JoinServer tiene la lista de GameServers incompleta. Alinea IP, puerto y la lista de servidores.
¿Puedo correr el JoinServer en otra máquina?
Puedes, siempre que el puerto esté abierto en el firewall y los GameServers apunten a la IP correcta de la máquina del JoinServer. En servidores más grandes esto es común para distribuir carga, pero exige atención redoblada con red y latencia interna.