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 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 obtener más información, consulta 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:
- El cliente de Java SignalR se ejecutará en el nivel 16 de la API de Android y versiones posteriores.
- La conexión a través del servicio de Azure SignalR requerirá el nivel de API de Android 20 y versiones posteriores, ya que el servicio de Azure SignalR requiere TLS 1.2 y no admite conjuntos de cifrado basados en SHA-1. Android ha agregado compatibilidad con conjuntos de cifrado SHA-256 (y versiones posteriores) en el nivel de API 20.
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. Usar withAccessTokenFactory para proporcionar una RxJava Cadena<Única>. 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.