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:
- Der SignalR-Java-Client wird auf Android-API-Ebene 16 und höher ausgeführt.
- Die Verbindung über Azure SignalR Service erfordert die Android-API-Ebene 20 und höher, da Azure SignalR Service TLS 1.2 erfordert und SHA-1-basierte Verschlüsselungssammlungen nicht unterstützt. Für Android wurde Unterstützung für SHA-256-Verschlüsselungssammlungen (und höher) auf API-Ebene 20 hinzugefügt.
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 eine RxJava Single<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 .class
verwenden.
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
ASP.NET Core