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

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

    1. […] a clientes HTML que no entran en el evento OnConnected() del Hub. Hace varios meses que escribí un post donde explicaba una opción para poder definir diferentes canales o grupos de mensajes dentro de un […]

      Like

    2. Gustavo Jimenez Avatar
      Gustavo Jimenez

      Disculpa, soy algo nuevo en esto, mi duda es como cacho el mensaje en la parte del cliente, tendras un ejemplo donde pueda guiarme. Saludos.

      Like

      1. Hola Gustavo,
        En asp.net/signalR hay muchos ejemplos.
        En que lenguaje estas trabajando C#, Javascript?
        Saludos
        -Bruno

        Like

    3. Gustavo Jimenez Avatar
      Gustavo Jimenez

      Asi es en C# con JavaScript, es que ya tengo el proyecto hecho con Clients.All, pero a todos les llega la notificación, necesito les llegue solo a usuarios especificos con el Clients.User o Clients.Group. Pero no ecuentro enviar a un usuario y como cacharlo en JavaScript

      Like

    Leave a comment

    Discover more from El Bruno

    Subscribe now to keep reading and get access to the full archive.

    Continue reading