client Java di ASP.NET Core SignalR

Di Mikael Mengistu

Il client Java consente la connessione a un server ASP.NET Core SignalR dal codice Java, incluse le app Android. Come il client JavaScript e il client .NET, il client Java consente di ricevere e inviare messaggi a un hub in tempo reale. Il client Java è disponibile in ASP.NET Core 2.2 e versioni successive.

L'app console Java di esempio a cui si fa riferimento in questo articolo usa il SignalR client Java.

Visualizzare o scaricare il codice di esempio (procedura per il download)

Installare il SignalR pacchetto client Java

Il file JAR signalr-7.0.0 consente ai client di connettersi agli SignalR hub. Per trovare il numero di versione del file JAR più recente, vedere i risultati della ricerca Maven.

Se si usa Gradle, aggiungere la riga seguente alla dependencies sezione del file build.gradle :

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

Se si usa Maven, aggiungere le righe seguenti all'interno dell'elemento <dependencies> del pom.xml file:

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

Connessione a un hub

Per stabilire un oggetto HubConnection, deve HubConnectionBuilder essere utilizzato . È possibile configurare l'URL dell'hub e il livello di log durante la compilazione di una connessione. Configurare le opzioni necessarie chiamando uno dei HubConnectionBuilder metodi prima builddi . Avviare la connessione con start.

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

Chiamare i metodi dell'hub dal client

Una chiamata a send richiama un metodo hub. Passare il nome del metodo hub e tutti gli argomenti definiti nel metodo hub a send.

hubConnection.send("Send", input);

Nota

La chiamata dei metodi hub da un client è supportata solo quando si usa il servizio di Azure SignalR in modalità predefinita . Per altre informazioni, vedere Domande frequenti (repository GitHub azure-signalr).

Chiamare i metodi client dall'hub

Usare hubConnection.on per definire i metodi nel client che l'hub può chiamare. Definire i metodi dopo la compilazione ma prima di avviare la connessione.

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

Aggiungere la registrazione

Il SignalR client Java usa la libreria SLF4J per la registrazione. Si tratta di un'API di registrazione di alto livello che consente agli utenti della libreria di scegliere la propria implementazione di registrazione specifica inserendo una dipendenza di registrazione specifica. Il frammento di codice seguente illustra come usare java.util.logging con il SignalR client Java.

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

Se non si configura la registrazione nelle dipendenze, SLF4J carica un logger di nessuna operazione predefinita con il messaggio di avviso seguente:

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.

Può essere tranquillamente ignorato.

Note sullo sviluppo per Android

Per quanto riguarda la compatibilità di Android SDK per le SignalR funzionalità client, prendere in considerazione gli elementi seguenti quando si specifica la versione di Android SDK di destinazione:

  • Il SignalR client Java verrà eseguito nel livello 16 dell'API Android e versioni successive.
  • Connessione tramite Azure SignalR Il servizio richiederà il livello API Android 20 e versioni successive perché il servizio di Azure SignalR richiede TLS 1.2 e non supporta le suite di crittografia basate su SHA-1. Android ha aggiunto il supporto per i pacchetti di crittografia SHA-256 (e versioni successive) nel livello API 20.

Configurare l'autenticazione del token di connessione

SignalR Nel client Java è possibile configurare un token di connessione da usare per l'autenticazione fornendo una "factory del token di accesso" a HttpHub Connessione ionBuilder. Usare withAccessTokenFactory per fornire una stringa singola>< RxJava. Con una chiamata a Single.defer, è possibile scrivere la logica per produrre token di accesso per il client.

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

Passaggio di informazioni sulla classe in Java

Quando si chiamano i onmetodi , invokeo stream di HubConnection nel client Java, gli utenti devono passare un Type oggetto anziché un Class<?> oggetto per descrivere qualsiasi generico Object passato al metodo . Un Type oggetto può essere acquisito usando la classe fornita TypeReference . Ad esempio, usando una classe generica personalizzata denominata Foo<T>, il codice seguente ottiene :Type

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

Per i tipi non generici, ad esempio primitive o altri tipi non con parametri come String, è sufficiente usare l'oggetto .classpredefinito .

Quando si chiama uno di questi metodi con uno o più tipi di oggetto, usare la sintassi generics quando si richiama il metodo . Ad esempio, quando si registra un on gestore per un metodo denominato func, che accetta come argomenti un oggetto String e un Foo<String> oggetto , usare il codice seguente per impostare un'azione per stampare gli argomenti:

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

Questa convenzione è necessaria perché non è possibile recuperare informazioni complete sui tipi complessi con il metodo a causa della Object.getClass cancellazione dei tipi in Java. Ad esempio, la chiamata getClass su un ArrayList<String> oggetto non restituisce Class<ArrayList<String>>, ma piuttosto Class<ArrayList>, che non fornisce al deserializzatore informazioni sufficienti per deserializzare correttamente un messaggio in arrivo. Lo stesso vale per gli oggetti personalizzati.

Limitazioni note

  • Il fallback del trasporto e il trasporto Eventi inviati dal server non sono supportati.
  • Il fallback del trasporto e il trasporto Eventi inviati dal server non sono supportati.
  • È supportato solo il JSprotocollo ON.
  • È supportato solo il JSprotocollo ON.
  • È supportato solo il trasporto WebSocket.
  • Lo streaming non è ancora supportato.

Risorse aggiuntive