Cliente de Java de ASP.NET Core SignalR

Por Mikael Mengistu

Este cliente de Java admite la conexión a una instancia del servidor de ASP.NET Core SignalR desde el código de Java, incluidas las aplicaciones Android. Al igual que el cliente de JavaScript y el cliente de .NET, el cliente de Java le permite recibir y enviar mensajes a un centro en tiempo real. El cliente de Java está disponible en ASP.NET Core 2.2 y versiones posteriores.

La aplicación de consola de Java de ejemplo a la que se hace referencia en este artículo usa el cliente de Java SignalR.

Vea o descargue el código de ejemplo (cómo descargarlo)

Instalación del paquete de cliente Java SignalR

El archivo JAR signalr-7.0.0 permite a los clientes conectarse a los concentradores de SignalR. Para buscar el número de versión del archivo JAR más reciente, consulte los resultados de búsqueda de Maven.

Si usa Gradle, agregue la siguiente línea a la sección dependencies del archivo build.gradle:

implementation 'com.microsoft.signalr:signalr:7.0.0'

Si usa Maven, agregue las siguientes líneas dentro del elemento <dependencies> del archivo pom.xml:

<dependency>
    <groupId>com.microsoft.signalr</groupId>
    <artifactId>signalr</artifactId>
    <version>1.0.0</version>
</dependency>

Conexión a un concentrador

Para establecer un HubConnection, se debe usar HubConnectionBuilder. La dirección URL del concentrador y el nivel de registro se pueden configurar al crear una conexión. Configure las opciones necesarias mediante una llamada a cualquiera de los métodos de HubConnectionBuilder anteriores a build. Inicie la conexión con start.

HubConnection hubConnection = HubConnectionBuilder.create(input)
        .build();

Llamada a los métodos del concentrador desde el cliente

Una llamada a send para invocar un método concentrador. Pase el nombre y los argumentos del método concentrador definidos en el método concentrador a send.

hubConnection.send("Send", input);

Nota:

La llamada a los métodos del concentrador desde un cliente solo es compatible cuando se usa el Servicio de Azure SignalR en modo Predeterminado. Para más información, consulte Preguntas más frecuentes (repositorio de GitHub de azure-signalr).

Llamada a los métodos de cliente desde el concentrador

Use hubConnection.on para definir los métodos en el cliente a los que puede llamar el concentrador. Defina los métodos después de la compilación, pero antes de iniciar la conexión.

hubConnection.on("Send", (message) -> {
    System.out.println("New Message: " + message);
}, String.class);

Adición de registro

El cliente Java SignalR utiliza la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica mediante la incorporación de una dependencia de registro específica. El siguiente fragmento de código muestra cómo utilizar java.util.logging con el cliente Java SignalR.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Si no configura el registro en sus dependencias, SLF4J carga por defecto un registrador de no-operación con el siguiente mensaje de advertencia:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Esto se puede ignorar.

Notas de desarrollo de Android

Con respecto a la compatibilidad de Android SDK para las características del cliente SignalR, tenga en cuenta los siguientes elementos al especificar la versión de Android SDK de destino:

Configuración de autenticación del token de portador

En el cliente Java SignalR, puede configurar un token de portador para utilizarlo en la autenticación proporcionando una “fábrica de tokens de acceso” al HttpHubConnectionBuilder. Utilice withAccessTokenFactory para proporcionar una cadena únicaRxJava<>. Con una llamada a Single.defer, puede escribir lógica para producir tokens de acceso para su cliente.

HubConnection hubConnection = HubConnectionBuilder.create("YOUR HUB URL HERE")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Pasar información de clase en Java

Al llamar a los métodos on, invoke o stream de HubConnection en el cliente Java, los usuarios deben pasar un objeto Type en lugar de un objeto Class<?> para describir cualquier Object genérico pasado al método. Se puede adquirir un Type mediante la clase TypeReference proporcionada. Por ejemplo, mediante una clase genérica personalizada denominada Foo<T>, el código siguiente obtiene el Type:

Type fooType = new TypeReference<Foo<String>>() { }).getType();

En el caso de los no genéricos, como primitivos u otros tipos no parametrizados como String, puede simplemente usar el .class integrado.

Al llamar a uno de estos métodos con uno o varios tipos de objeto, use la sintaxis genérica al invocar el método. Por ejemplo, al registrar un controlador on para un método denominado func, que toma como argumentos una cadena y un objeto Foo<String>, use el código siguiente para establecer una acción para imprimir los argumentos:

hubConnection.<String, Foo<String>>on("func", (param1, param2) ->{
    System.out.println(param1);
    System.out.println(param2);
}, String.class, fooType);

Esta convención es necesaria porque no podemos recuperar la información completa sobre los tipos complejos con el método Object.getClass debido a la eliminación de tipos en Java. Por ejemplo, llamar a getClass en un ArrayList<String> no devolvería Class<ArrayList<String>>, sino Class<ArrayList>, que no proporciona suficiente información al deserializador para deserializar correctamente un mensaje entrante. Lo mismo sucede con los objetos personalizados.

Restricciones conocidas

  • No se admite la reserva de transporte ni el transporte de eventos enviados por el servidor.
  • No se admite la reserva de transporte ni el transporte de eventos enviados por el servidor.
  • Solo se admite el protocolo JSON.
  • Solo se admite el protocolo JSON.
  • Solo se admite el transporte de WebSockets.
  • Todavía no se admite el streaming.

Recursos adicionales