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 JAR signalr-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í do centra

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ě GitHub azure-signalr).

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 Azure SignalR Služba 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í, a to poskytnutím "objektu pro vytváření přístupových tokenů" pro HttpHub Připojení ionBuilder. 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ě. invokeon 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.
  • JSPodporuje se pouze protokol ON.
  • JSPodporuje se pouze protokol ON.
  • Podporuje se pouze přenos WebSockets.
  • Streamování se zatím nepodporuje.

Další prostředky