logo
Guías

Varios canales simultáneos

Gestiona varios ámbitos de red desde un mismo cliente.

Varios canales simultáneos

Una de las características importantes del modelo de Eco es que un cliente puede pertenecer a varios canales al mismo tiempo. La pertenencia a un canal no sustituye a la anterior: cada Canal mantiene su propio contexto de red dentro de la misma conexión.

Idea principal

Un cliente puede estar conectado una sola vez al servidor y participar simultáneamente en varios canales. Cada canal representa un ámbito independiente de estado compartido.

Escenario

Un caso práctico puede ser un juego que mantiene:

Conexión

├── Canal 10 · Mundo
│   └── Estado persistente del mundo

├── Canal 20 · Partida
│   └── Estado de la partida actual

└── Canal 30 · Evento
    └── Actividad temporal

El jugador puede permanecer en Mundo mientras entra y sale de Partida y Evento.

Entrar en varios canales

El cliente puede solicitar sucesivas entradas sin abandonar el canal anterior:

cliente.JoinChannel(10, "Mundo", true, 100, "");
cliente.JoinChannel(20, "Partida", false, 4, "");
cliente.JoinChannel(30, "Evento", false, 32, "");

Las solicitudes de entrada quedan registradas como pendientes hasta que Eco recibe la confirmación correspondiente. Esto permite que el estado local diferencie entre un canal ya activo y uno que todavía está completando su incorporación.

Consultar la pertenencia

bool enMundo = cliente.IsInChannel(10);
bool enPartida = cliente.IsInChannel(20);
bool enEvento = cliente.IsInChannel(30);

Canal mundo = cliente.GetChannel(10);
Canal partida = cliente.GetChannel(20);

También puede comprobarse si una entrada concreta sigue pendiente:

bool uniendose = cliente.IsJoiningChannel(20);

Los canales no son sockets

La presencia en varios canales no implica crear varias conexiones TCP o UDP.

                 Una conexión

          ┌───────────┼───────────┐
          │           │           │
       Canal 10     Canal 20    Canal 30

El transporte sigue perteneciendo a la conexión. El canal determina el contexto de estado y los destinatarios que corresponden a esa parte de la sesión.

Diseño recomendado

No mantengas una conexión por canal salvo que exista una necesidad específica fuera del modelo de Eco. Normalmente los canales deben utilizarse como ámbitos lógicos dentro de una misma conexión.

Objetos y canales

Los objetos de red tienen un channelID y su identidad completa utiliza también el contexto del canal. Por eso dos objetos con el mismo identificador local pueden pertenecer a canales diferentes sin representar la misma entidad de red.

Canal 10
└── Objeto 100

Canal 20
└── Objeto 100

Para operaciones de red, el canal forma parte del contexto necesario para localizar correctamente el objeto.

Salir de un canal

Abandonar un canal no desconecta al cliente del servidor ni afecta automáticamente a los demás canales:

cliente.LeaveChannel(20);

Después de la salida:

Conexión

├── Canal 10 ✅
├── Canal 20 ❌
└── Canal 30 ✅

También existe LeaveAllChannels() para solicitar la salida de todos los canales activos.

Cambiar el nivel de un canal

El nivel asociado a un canal es parte de su estado. Eco permite solicitar el cambio de nivel para un canal concreto:

cliente.LoadLevel(20, "Arena");

Esto debe entenderse como una operación coordinada del canal y no simplemente como una llamada local a SceneManager.LoadScene.

El cambio de nivel forma parte además del motivo por el que Eco mantiene protecciones durante la entrada a canales: mientras la transición está en curso, evita que determinadas operaciones de la escena anterior se ejecuten fuera de contexto.

Ejemplo: mundo + partida

Un patrón habitual es mantener un canal persistente para el mundo y otro temporal para una partida:

// El jugador permanece en el mundo.
cliente.JoinChannel(10, "Mundo", true, 100, "");

// Se crea una sesión temporal de partida.
cliente.JoinChannel(20, "Partida", false, 4, "");

La lógica puede tratar cada canal de forma independiente:

if (cliente.IsInChannel(20))
{
    // Estado de la partida.
}

if (cliente.IsInChannel(10))
{
    // Estado persistente del mundo.
}

Esto resulta especialmente útil cuando diferentes partes del juego necesitan ciclos de vida distintos.

Cuándo utilizar canales

Un canal es apropiado cuando quieres separar un ámbito de estado compartido entre participantes.

Necesidad¿Canal?
Mundo persistente compartido
Partida independiente
Evento temporal con jugadores concretos
Simplemente enviar un mensaje a un jugadorNo necesariamente
Separar transporte físicoNo
Representar una entidad del mundoNo; utiliza un Objeto

Relación con TNet

El modelo multicanal procede de la arquitectura de TNet y Eco mantiene esta capacidad con su propia API. Para consultar el comportamiento actual, la fuente normativa es ClienteJuego y Canal dentro de Nervelink/eco.

La ventaja de esta documentación frente a los ejemplos antiguos es que no debemos asumir un único canal activo por cliente.

Referencias

Canales

Referencia completa del ciclo de vida y estado de un canal.

Cliente

Gestión de conexión y canales desde el cliente.

TNet

Repositorio upstream de la arquitectura heredada.

DeepWiki · TNet

Referencia externa para contrastar el modelo de canales de TNet.

On this page