Klient javy ASP.NET Core SignalR
Autor: Mikael Mengistu
Klient Java umožňuje připojení k serveru ASP.NET Core SignalR z kódu Javy, včetně aplikací pro Android. Stejně jako javascriptový klient a klient .NET umožňuje java klient přijímat a posílat zprávy do centra v reálném čase. Klient Java je k dispozici v ASP.NET Core 2.2 a novější.
Ukázková konzolová aplikace v Javě, na které odkazuje tento článek, používá SignalR klienta Javy.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
SignalR Instalace balíčku klienta Java
Soubor signalrJAR -7.0.0 umožňuje klientům připojit se k SignalR rozbočovačům. Nejnovější číslo verze souboru JAR najdete ve výsledcích hledání Mavenu.
Pokud používáte Gradle, přidejte do oddílu dependencies
souboru build.gradle následující řádek:
implementation 'com.microsoft.signalr:signalr:7.0.0'
Pokud používáte Maven, přidejte do elementu <dependencies>
souboru pom.xml
následující řádky:
<dependency>
<groupId>com.microsoft.signalr</groupId>
<artifactId>signalr</artifactId>
<version>1.0.0</version>
</dependency>
Připojení k centru
K vytvoření HubConnection
, HubConnectionBuilder
je třeba použít. Při vytváření připojení je možné nakonfigurovat adresu URL centra a úroveň protokolu. Nakonfigurujte všechny požadované možnosti voláním některé z HubConnectionBuilder
metod před build
. Spusťte spojení s start
.
HubConnection hubConnection = HubConnectionBuilder.create(input)
.build();
Metody centra volání z klienta
Volání send
vyvolá metodu centra. Předejte název metody centra a všechny argumenty definované v metodě centra do send
.
hubConnection.send("Send", input);
Poznámka:
Volání metod centra z klienta je podporováno pouze při použití služby Azure SignalR ve výchozím režimu. Další informace najdete v tématu Nejčastější dotazy (úložiště Azure–signalr GitHub).
Volání metod klienta z centra
Slouží hubConnection.on
k definování metod v klientovi, který může centrum volat. Definujte metody po sestavení, ale před spuštěním připojení.
hubConnection.on("Send", (message) -> {
System.out.println("New Message: " + message);
}, String.class);
Přidání protokolování
Klient SignalR Java používá k protokolování knihovnu SLF4J . Jedná se o rozhraní API pro protokolování vysoké úrovně, které uživatelům knihovny umožňuje zvolit si vlastní konkrétní implementaci protokolování tím, že přinese konkrétní závislost protokolování. Následující fragment kódu ukazuje, jak se používá java.util.logging
s klientem SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Pokud v závislostech nenakonfigurujete protokolování, SLF4J načte výchozí protokolovací nástroj bez operace s následující zprávou upozornění:
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.
To se dá bezpečně ignorovat.
Poznámky k vývoji pro Android
Pokud jde o kompatibilitu SignalR sady Android SDK pro funkce klienta, při určování cílové verze sady Android SDK zvažte následující položky:
- Klient SignalR Java se spustí na úrovni rozhraní ANDROID API 16 a novější.
- Připojení prostřednictvím služby Azure SignalR bude vyžadovat rozhraní ANDROID API úrovně 20 a novější, protože služba Azure SignalR vyžaduje protokol TLS 1.2 a nepodporuje šifrovací sady založené na sha-1. Android přidal podporu šifrovacích sad SHA-256 (a vyšších) v rozhraní API Level 20.
Konfigurace ověřování nosný token
V klientovi SignalR Java můžete nakonfigurovat nosný token, který se má použít pro ověřování, poskytnutím objektu pro vytváření přístupových tokenů pro HttpHubConnectionBuilder. Použití sAccessTokenFactory k poskytnutí jednoho<řetězce> RxJava. Při volání Single.defer můžete napsat logiku pro vytváření přístupových tokenů pro vašeho klienta.
HubConnection hubConnection = HubConnectionBuilder.create("YOUR HUB URL HERE")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Předávání informací o třídě v Javě
Při volání , nebo metody HubConnection
v klientovi Java by uživatelé měli předat Type
objekt místo Class<?>
objektu popisovat jakýkoli obecný Object
předaný stream
metodě. invoke
on
A Type
lze získat pomocí poskytnuté TypeReference
třídy. Například použití vlastní obecné třídy s názvem Foo<T>
, následující kód získá Type
:
Type fooType = new TypeReference<Foo<String>>() { }).getType();
Pro jiné než obecné typy, jako jsou primitivy nebo jiné neparametrizované typy String
, jako jsou , můžete jednoduše použít předdefinované .class
.
Při volání jedné z těchto metod s jedním nebo více typy objektů použijte při vyvolání metody obecnou syntaxi. Například při registraci on
obslužné rutiny pro metodu s názvem func
, která přebírá jako argumenty String a Foo<String>
objekt, pomocí následujícího kódu nastavte akci pro tisk argumentů:
hubConnection.<String, Foo<String>>on("func", (param1, param2) ->{
System.out.println(param1);
System.out.println(param2);
}, String.class, fooType);
Tato konvence je nezbytná, protože nemůžeme načíst úplné informace o komplexních typech s metodou Object.getClass
kvůli vymazání typu v Javě. Například volání getClass
na by ArrayList<String>
se nevrátilo Class<ArrayList<String>>
, ale spíše Class<ArrayList>
, což nedává deserializátor dostatek informací k správné deserializaci příchozí zprávy. Totéž platí pro vlastní objekty.
Známá omezení
- Přenos náhradních událostí a přenos odeslaných událostí serveru se nepodporuje.
- Přenos náhradních událostí a přenos odeslaných událostí serveru se nepodporuje.
- Podporuje se jenom protokol JSON.
- Podporuje se jenom protokol JSON.
- Podporuje se pouze přenos WebSockets.
- Streamování se zatím nepodporuje.