ASP.NET Core SignalR-Java-Client

Von Mikael Mengistu

Der Java-Client unterstützt die Verbindung mit einem ASP.NET Core-SignalR-Server über Java-Code, einschließlich Android-Apps. Wie der JavaScript-Client und .NET-Client ermöglicht Ihnen der Java-Client das Empfangen und Senden von Nachrichten an einen Hub in Echtzeit. Der Java-Client ist ab ASP.NET Core 2.2 verfügbar.

Das Beispiel einer Java-Konsolen-App, auf die in diesem Artikel verwiesen wird, verwendet den SignalR-Java-Client.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)

Installieren des SignalR-Java-Clientpakets

Mithilfe der JAR-Datei signalr-7.0.0 können Clients eine Verbindung mit SignalR-Hubs herstellen. Die neueste Versionsnummer der JAR-Datei finden Sie in den Maven-Suchergebnissen.

Wenn Sie Gradle verwenden, fügen Sie in Ihrer Datei build.gradle dem Abschnitt dependencies die folgende Zeile hinzu:

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

Wenn Sie Maven verwenden, fügen Sie Ihrer Datei pom.xml innerhalb des Elements <dependencies> die folgenden Zeilen hinzu:

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

Herstellen einer Verbindung mit einem Hub

Zum Einrichten von HubConnection muss HubConnectionBuilder verwendet werden. Hub-URL und Protokollebene können beim Aufbau einer Verbindung konfiguriert werden. Konfigurieren Sie alle erforderlichen Optionen, indem Sie eine der HubConnectionBuilder-Methoden vor build aufrufen. Starten Sie die Verbindung mit start.

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

Aufrufen von Hubmethoden auf dem Client

Ein Aufruf von send ruft eine Hubmethode auf. Übergeben Sie den Namen der Hubmethode und in der Hubmethode definierte Argumente an send.

hubConnection.send("Send", input);

Hinweis

Das Aufrufen von Hubmethoden durch einen Client wird nur bei Verwendung von Azure SignalR Service im Modus Default unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen (GitHub-Repository azure-signalr).

Aufrufen von Clientmethoden auf dem Hub

Verwenden Sie hubConnection.on, um Methoden auf dem Client zu definieren, die der Hub aufrufen kann. Definieren Sie die Methoden nach dem Aufbauen, aber vor dem Starten der Verbindung.

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

Hinzufügen der Protokollierung

Der Java-Client von SignalR verwendet für die Protokollierung die Bibliothek SLF4J. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

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

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

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.

Diese kann gefahrlos ignoriert werden.

Hinweise zur Android-Entwicklung

Im Hinblick auf Kompatibilität mit dem Android SDK für die SignalR-Clientfeatures sollten Sie die folgenden Punkte beim Angeben Ihrer Android SDK-Zielversion berücksichtigen:

Konfigurieren der Bearertokenauthentifizierung

Im SignalR-Java-Client können Sie ein Bearertoken für die Authentifizierung konfigurieren, indem Sie httpHubConnectionBuilder eine „Zugriffstokenfactory“ bereitstellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

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

Übergeben von Klasseninformationen in Java

Beim Aufrufen der Methoden on, invoke oder stream von HubConnection im Java-Client müssen die Benutzer ein Type-Objekt anstelle eines Class<?>-Objekts übergeben, um jedes an die Methode übergebene generische Object zu beschreiben. Type kann mithilfe der bereitgestellten TypeReference-Klasse abgerufen werden. Bei Verwendung einer benutzerdefinierten generischen Klasse mit dem Namen Foo<T> ruft der folgende Code beispielsweise Type ab:

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

Für Nicht-Generics, z. B. Primitive oder andere nicht parametrisierte Typen wie String, können Sie einfach die integrierte .classverwenden.

Wenn Sie eine dieser Methoden mit einem oder mehreren Objekttypen aufrufen, verwenden Sie beim Aufrufen der Methode die Generics-Syntax. Wenn Sie beispielsweise einen on-Handler für eine Methode namens func registrieren, die als Argumente eine Zeichenfolge und ein Foo<String>-Objekt akzeptiert, legen Sie mit folgendem Code eine Aktion zum Ausgeben der Argumente fest:

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

Diese Konvention ist notwendig, weil wir mit der Object.getClass-Methode aufgrund der Typlöschung in Java keine vollständigen Informationen zu komplexen Typen abrufen können. Beispielsweise gibt der Aufruf von getClass für ArrayList<String> nicht Class<ArrayList<String>>, sondern Class<ArrayList> zurück, was dem Deserialisierer nicht genügend Informationen liefert, um eine eingehende Nachricht ordnungsgemäß zu deserialisieren. Dasselbe gilt für benutzerdefinierte Objekte.

Bekannte Einschränkungen

  • Transportfallback und Server Sent Events-Transport werden nicht unterstützt.
  • Transportfallback und Server Sent Events-Transport werden nicht unterstützt.
  • Nur das JSON-Protokoll wird unterstützt.
  • Nur das JSON-Protokoll wird unterstützt.
  • Nur der WebSockets-Transport wird unterstützt.
  • Streaming wird noch nicht unterstützt.

Zusätzliche Ressourcen