[#SIGNALR] HowTo: separar mensajes para grupos de clientes (o darte la cabeza con la pared hasta que llegas aqui)

Hola!

¿Conoces SignalR? ¿No!!!? Imposible que todavía no conozcas SignalR. Si no lo conoces, lo mejor es darse una vuelta por el main site de SignalR o comprar por €5 el libro eléctronico del crack de Jose María Aguilar (link).

Pues bien, yo lo voy aprendiendo a tirones, y hasta hace unas horas pensaba que tenía la ayuda de Roberto y Benjamin. Por suerte, ambos están en Barcelona y yo en Madrid, porque si los tuviese cerca >> les corto los dedos !!!

No voy a entrar mucho en detalle sobre qué es SignalR, solo comentaré que es una serie de libraries que permiten realizar comunicaciones bidireccionales entre server y client, aislándonos de tecnologías como websockets.

La comunicaciones client / server no son nada nuevo, tampoco lo es el siguiente escenario::

  • Una serie de clientes se suscriben para la recepción de un tipo de mensaje
    Literalmente, no es así en SignalR pero es más simple para explicarlo.
  • Opcionalmente, cada cliente se identifica con el server, definiendo que pertenece a un grupo.
  • El cliente A envia un mensaje X a todos los clientes
  • El Cliente B, también envia un mensaje de tipo X, pero no a todos los clientes, solo a los de un grupo determinado

Pues bien, después de ver un código bastante complicado para esta implementación, de mis amigos Benjamin y Roberto; la siguiente solución es mucho más simple (like always, nos gusta lo simple)

   1: public class MessagesHub : Hub

   2: {

   3:     public void JoinToArea(string area)

   4:     {

   5:         Groups.Add(Context.ConnectionId, area);

   6:     }

   7:  

   8:     public void SendMessage(string message, string area = "")

   9:     {

  10:         if (string.IsNullOrEmpty(area))

  11:         {

  12:             Clients.All.SendMessage(message);

  13:         }

  14:         else

  15:         {

  16:             Clients.Group(area).SendMessage(message);

  17:         }

  18:     }

  19: }

Repasemos un poco, lo que tiene este Hub de mensajes SignalR.

  • La función JoinToArea() es la que debe llamarse desde cada cliente del hub para identificarse en un area específica.
    • La misma agrega el Id de conexión del cliente (a través de su contexto) a un grupo.
    • El grupo se identica con el área.
  • La función SendMessage() recibe un parámetro que es el mensaje propiamente dicho y otro parámetro opcional que es el área.
    • Si no se específica un área, el mensaje se envía a todos los clientes (línea 12), Clients.All.
    • Si se especifica un área, se filtran los clientes, el el grupo definido con el nombre del área, Clients.Group(area).

La verdad que como solución es bastante útil, y además solo requiere pocas líneas de código. Debajo dejo un step by step más completo que explica el trabajo con grupos.

Finalmente, comentar que el escenario donde estamos trabajando nosotros, es bastante más complicado. Este approach nos sirve para reducir un poco la complejidad del código, aunque creo que seguirá “oliendo mal” para mi gusto.

Referencia: http://www.asp.net/signalr/overview/signalr-20/hubs-api/working-with-groups

Saludos @ Home

El Bruno

image image image Google

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *