Opciones para comunicarse con los clientes en SignalR

Continuando con los post’s asociados a SignalR, ya hemos podido ver tanto la implementación de SignalR dentro de ASP.NET MVC cómo el concepto del ConnectionId para identificar de forma unívoca a un cliente. Sobre esto último hemos mencionado que en las formas de envío más avanzadas de SignalR se debe hacer uso de este valor.

Veamos cuales son las formas de conexión a clientes que tenemos disponibles desde el servidor hacia los clientes:

Broadcast:

Para mi esta es la forma más sencilla de enviar notificaciones, ya que se las enviamos a absolutamente todos los clientes conectados a nuestra aplicación sin necesidad de conocer quienes son.

Este es el ejemplo que venimos usando desde el primer post asociado a la implementaciónel primer post asociado a la implementación. Para hacer uso de esta opción el Hub usaremos el elemento Clients con la opción All, indicando luego la operación del lado del cliente que queremos invocar:

Others:

Esta opción también la podemos clasificar dentro de las más simples, y es muy similar al Broadcast. Como su nombre evidencia, la diferencia radica en que envía la notificación a todos los clientes que no sean quien se ha comunicado con el Hub.

La diferencia en el uso pasará por indicar sobre Clients el elemento Others en vez de All. Si nos ponemos a pensar el ejemplo explicado en el post de implementación de SignalR, esta sería la alternativa de implementación que deberíamos haber usado, ya que no tiene sentido que el cliente que hace la acción reciba la notificación de que eso había pasado.

Client:

En esta forma de comunicación deberemos hacer uso por primera vez del ConnectionId. Esto se debe a que en este caso querremos comunicarnos con un cliente en particular y dicha identificación se realiza por el ConnectionId. Para estos casos deberemos agregar algo más de lógica en nuestra aplicación del lado del servidor, ya que de alguna forma deberemos saber cual es el ConnectionId en particular del cliente al cual nos queremos comunicar.

El uso en sí es similar al ejemplo anterior, solo que en vez de indicar Others haremos uso de la función Client indicando como parámetro el identificador de conexión del cliente a notificar:

Groups:

Los grupos en SignalR representan lo que considero la alternativa más potente de gestión de la comunicación bidireccional entre el servidor y los clientes. Esto se debe a que nos da la flexibilidad para administrar distintos clientes en grupos, y luego realizar la comunicación a un grupo particular independientemente de quienes sean los clientes que pertenecen al mismo. Este generalmente será el ámbito de uso más común de SignalR en una aplicación real, ya que no es muy usual enviarles notificaciones a absolutamente todos los clientes, sino que a un conjunto limitado que tienen algo en común (participan de una misma partida si hablamos de un juego, o bien trabajan en la misma lista de tareas si seguimos con el ejemplo del post inicial).

Aquí nuevamente debemos trabajar en nuestra lógica de negocio para darle forma a esos grupos, siendo el posterior uso de los mismos bien sencillo. Es como el caso anterior, sólo que usaremos la función Group indicando el nombre del grupo en cuestión.

Acá claramente haya algo que nos está faltando ver: cómo administramos los grupos y sus integrantes. Esto lo veremos en mayor detalle en un post dedicado íntegramente a grupos, ya que además del ejemplo puesto anteriormente hay algunas variantes de uso con las cuales podemos contar.

Gracias por leer!!

Anuncios

6 comentarios en “Opciones para comunicarse con los clientes en SignalR

  1. Buenos días, Diego, excelente post sigo mucho tu blog. Tengo una pregunta nunca he implementado SignalR, por mi trabajo siento la necesidad de implementarlo, pero en mi caso necesito en un webApi, no se si mas adelante colocara algun post de como realizarlo y segun tu experiencias cuales seria la mejores practicas de usar SignalR y no llenar de puras notificaciones o realizar cosas sin sentidos que no lleve a un mal rendimiento en la aplicación. Gracias.

    Me gusta

  2. Buenos días Erwing.
    Sobre SignalR y WebApi tengo la intención de armar un post más adelante, como cierre de la serie de aplicaciones Real-Time.
    A mi criterio la buena práctica esencial radica en diseñar la interacción completa de nuestra aplicación, tanto del lado del cliente como del servidor, teniendo en cuenta el minimizar la cantidad de interacciones que podamos identificar como no necesarias, siempre sin sacrificar funcionalidad final para el usuario.
    Esto dependerá mucho del caso particular a tratar, pero hay que considerar el buen uso de las distintas alternativas de comunicación que vimos en este post y en el de grupos publicado ayer para minimizar las interacciones innecesarias.

    Si tienes algún ejemplo puntual o duda que quieras profundizar puntualmente (por cualquiera de los dos puntos que me mencionas) me avisas y vemos cómo podemos hacer.

    Saludos!

    Me gusta

  3. Buenas Tardes Diego, tengo una pregunta de SignalR por si me puedes ayudar, se que puedes conectarte atraes de diferentes navegadores, y que todos vean el mensaje de todos, pero se puede establecer comunicación entre esos clientes 1 a 1

    Me gusta

    • Buenas!
      Si, lo que estás necesitando aplicar es lo visto en este post bajo el título Client. SignalR te permite tanto comunicarte de forma general, a un grupo de clientes o a un cliente en particular.
      Básicamente la clase Hub tiene que saber a que otro cliente debe comunicarse, es decir el ConnectionId del destinatario. El tener disponible ese valor dependerá de las características de tu aplicación.

      Si algo no queda claro me avisas, saludos!

      Me gusta

  4. Hola Diego, muy buenos tus post, estoy arrancando a trabajar con signalR y se me presento el siguiente problema, hice un ejemplo con hub y solo me funciona desde 2 clientes, cuando quiero ejecutar un tercer cliente/navegador no me responde hasta tanto no cierre alguno de los 2 primeros clientes abiertos, como que tengo un limite en lo que puedo usar, estoy usando windows 10 como servidor, esto me pasa ya con el ejemplo publicado y corriendo sobre el iis. Desde ya muchas gracias.

    Me gusta

    • Buenas Lucas, muchas gracias!
      Te comento que recién realicé una prueba desde Windows 10 con IIS Express y no tuve problemas en tener 4 conexiones. Si bien puede haber un límite de conexiones en un ambiente de desarrollo, investigando deberían ser como mínimo 10 clientes.
      Por las dudas, lo estás ejecutando con IIS Express o con el IIS “completo”? A su vez lo integraste de forma genérica a SignalR o realizaste algo adicional por las características de la aplicación?
      Algo que se me ocurre es en tu Hub hacer el override del método OnConnected agregando un punto de interrupción, de esa forma podrías validar cuando está llegando la invocación de inicialización de la conexión.
      Cualquier cosa me avisas, saludos!

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s