ASP.NET Core SignalR Java-klient
Java-klienten gör det möjligt att ansluta till en ASP.NET Core SignalR-server från Java-kod, inklusive Android-appar. Precis som JavaScript-klienten och .NET-klientenkan du med Java-klienten ta emot och skicka meddelanden till en hubb i realtid. Java-klienten är tillgänglig i ASP.NET Core 2.2 och senare.
Java-exempelkonsolappen som refereras i den här artikeln använder SignalR Java-klienten.
Visa eller ladda ned exempelkod (hur du laddar ned)
Installera SignalR Java-klientpaketet
Med signalr-7.0.0 JAR-fil kan klienter ansluta till SignalR hubbar. Information om hur du hittar det senaste jar-filversionsnumret finns i Maven-sökresultatet.
Om du använder Gradle lägger du till följande rad i avsnittet dependencies
i filen build.gradle:
implementation 'com.microsoft.signalr:signalr:7.0.0'
Om du använder Maven lägger du till följande rader i <dependencies>
-elementet i filen pom.xml
:
<dependency>
<groupId>com.microsoft.signalr</groupId>
<artifactId>signalr</artifactId>
<version>1.0.0</version>
</dependency>
Ansluta till en hubb
För att upprätta en HubConnection
ska HubConnectionBuilder
användas. Hubb-URL:en och loggnivån kan konfigureras när du skapar en anslutning. Konfigurera alla nödvändiga alternativ genom att anropa någon av de HubConnectionBuilder
metoderna innan build
. Starta anslutningen med start
.
HubConnection hubConnection = HubConnectionBuilder.create(input)
.build();
Anropa hubbmetoder från klienten
Ett anrop till send
anropar en hubbmetod. Skicka hubbmetodens namn och de argument som definierats i hubbmetoden till send
.
hubConnection.send("Send", input);
Not
Anrop av hubbmetoder från en klient stöds endast när man använder Azure SignalR-tjänsten i standardläge för. Mer information finns i Vanliga frågor och svar (GitHub-lagringsplats för azure-signalr).
Anropa klientmetoder från hubben
Använd hubConnection.on
för att definiera metoder på klienten som hubben kan anropa. Definiera metoderna efter att du har skapat men innan du startar anslutningen.
hubConnection.on("Send", (message) -> {
System.out.println("New Message: " + message);
}, String.class);
Lägg till loggning
SignalR Java-klienten använder SLF4J-biblioteket för loggning. Det är ett högnivåloggnings-API som gör det möjligt för biblioteksanvändare att välja sin egen specifika loggningsimplementering genom att införa ett specifikt loggningsberoende. Följande kodfragment visar hur du använder java.util.logging
med SignalR Java-klienten.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Om du inte konfigurerar loggning i dina beroenden läser SLF4J in en standardloggning utan åtgärd med följande varningsmeddelande:
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.
Detta kan ignoreras på ett säkert sätt.
Android-utvecklingsanteckningar
När det gäller Android SDK-kompatibilitet för SignalR-klientfunktioner bör du tänka på följande när du anger din Android SDK-målversion:
- Den SignalR Java-klienten körs på Android API-nivå 16 och senare.
- Anslutning via Azure SignalR Service kräver Android API Nivå 20 och senare eftersom Azure SignalR Service kräver TLS 1.2 och inte stöder SHA-1-baserade chiffersviter. Android har lagt till stöd för SHA-256 (och över) chiffersviter i API-nivå 20.
Konfigurera ägartokenautentisering
I SignalR Java-klienten kan du konfigurera en ägartoken som ska användas för autentisering genom att tillhandahålla en "åtkomsttokenfabrik" till HttpHubConnectionBuilder. Använd med AccessTokenFactory för att tillhandahålla en RxJava<String>. Med ett anrop till Single.deferkan du skriva logik för att skapa åtkomsttoken för klienten.
HubConnection hubConnection = HubConnectionBuilder.create("YOUR HUB URL HERE")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Skicka klassinformation i Java
När användarna anropar on
, invoke
eller stream
metoder för HubConnection
i Java-klienten bör de skicka ett Type
objekt i stället för ett Class<?>
objekt för att beskriva alla generiska Object
som skickas till metoden. En Type
kan hämtas med hjälp av den angivna TypeReference
-klassen. Om du till exempel använder en anpassad generisk klass med namnet Foo<T>
hämtar följande kod Type
:
Type fooType = new TypeReference<Foo<String>>() { }).getType();
För icke-generiska objekt, till exempel primitiver eller andra icke-parametriserade typer som String
, kan du helt enkelt använda den inbyggda .class
.
När du anropar en av dessa metoder med en eller flera objekttyper använder du syntaxen generics när du anropar metoden. När du till exempel registrerar en on
-hanterare för en metod med namnet func
, som tar som argument en sträng och ett Foo<String>
-objekt, använder du följande kod för att ange en åtgärd för att skriva ut argumenten:
hubConnection.<String, Foo<String>>on("func", (param1, param2) ->{
System.out.println(param1);
System.out.println(param2);
}, String.class, fooType);
Den här konventionen är nödvändig eftersom vi inte kan hämta fullständig information om komplexa typer med Object.getClass
-metoden på grund av typ radering i Java. Om du till exempel anropar getClass
på en ArrayList<String>
returneras inte Class<ArrayList<String>>
, utan i stället Class<ArrayList>
, vilket inte ger deserialiseraren tillräckligt med information för att korrekt deserialisera ett inkommande meddelande. Detsamma gäller för anpassade objekt.
Kända begränsningar
- Transportåterställning och transport av skickade serverhändelser stöds inte.
- Transportåterställning och transport av skickade serverhändelser stöds inte.
- Endast JSON-protokollet stöds.
- Endast JSON-protokollet stöds.
- Endast WebSockets-transporten stöds.
- Direktuppspelning stöds inte än.
Ytterligare resurser
ASP.NET Core