共用方式為


ASP.NET Core SignalR Java 用戶端

作者:Mikael Mengistu

Java 用戶端能夠從 Java 程式碼連線到 ASP.NET Core SignalR 伺服器,包括 Android 應用程式。 如同 JavaScript 用戶端.NET 用戶端,Java 用戶端可讓您即時接收和傳送訊息到中樞。 Java 用戶端適用於 ASP.NET Core 2.2 和更新版本。

本文引用的 Java 主控台應用程式範例會使用 SignalR Java 用戶端。

檢視或下載範例程式碼 \(英文\) (如何下載)

安裝 SignalR Java 用戶端套件

signalr-7.0.0 JAR 檔案可讓用戶端連線到 SignalR 中樞。 若要尋找最新的 JAR 檔案版本號碼,請參閱 Maven 搜尋結果

如果使用 Gradle,請將以下一行新增至 build.gradle 檔案的 dependencies 區段:

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

如果使用 Maven,請在 pom.xml 檔案的 <dependencies> 元素內新增下列幾行:

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

連線到中樞

若要建立 HubConnection,應該使用 HubConnectionBuilder。 您可以在建置連線時,設定中樞 URL 和記錄層級。 在 build 之前呼叫任何 HubConnectionBuilder 方法,以設定任何必要選項。 使用 start 開始連線。

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

從用戶端呼叫中樞方法

呼叫 send 可叫用中樞方法。 將中樞方法名稱和中樞方法中定義的任何引數傳遞至 send

hubConnection.send("Send", input);

注意

只有在以「預設」模式使用 Azure SignalR Service 時,才支援從用戶端呼叫中樞方法。 如需詳細資訊,請參閱常見問題集 (azure-signalr GitHub 存放庫)

從中樞呼叫用戶端方法

使用 hubConnection.on 在中樞可以呼叫的用戶端上定義方法。 在建置之後,但在開始連線之前定義方法。

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

新增記錄

SignalR Java 用戶端會使用 SLF4J 程式庫進行記錄。 這是一個高階記錄 API,可讓程式庫的使用者藉由引進特定記錄相依性來選擇自己的特定記錄實作。 下列程式碼片段示範如何搭配 SignalR Java 用戶端使用 java.util.logging

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

如果您未在相依性中設定記錄,SLF4J 會載入具有下列警告訊息的預設無作業記錄器:

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.

加以忽略沒有關係。

Android 開發注意事項

關於 SignalR 用戶端功能的 Android SDK 相容性,請在指定目標 Android SDK 版本時考量下列項目:

設定持有人權杖驗證

在 SignalR Java 用戶端中,您可以將「存取權杖處理站」提供給 HttpHubConnectionBuilder,以設定要用於驗證的持有人權杖。 使用 withAccessTokenFactory 提供 RxJavaSingle<String>。 透過呼叫 Single.defer,您可以撰寫邏輯來產生用戶端的存取權杖。

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

在 Java 中傳遞類別資訊

在 Java 用戶端中呼叫 HubConnectiononinvokestream 方法時,使用者應該傳遞 Type 物件 (而非 Class<?> 物件) 來描述任何傳遞至此方法的泛型 Object。 使用所提供的 TypeReference 類別可取得 Type。 例如,使用名為 Foo<T> 的自訂泛型類別,下列程式碼會取得 Type

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

若為非泛型,例如基本或其他非參數化型別 (像是 String),您可以直接使用內建的 .class

使用一或多個物件類型呼叫其中一個方法時,請在叫用方法時使用泛型語法。 例如,針對名為 func 的方法 (其接受以 String 和 Foo<String> 物件作為引數) 註冊 on 處理常式時,使用下列程式碼來設定用以列印引數的動作:

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

這是必要的慣例,因為我們由於型別抹除而無法在 Java 中使用 Object.getClass 方法擷取複雜型別的完整資訊。 例如,在 ArrayList<String> 上呼叫 getClass 不會傳回 Class<ArrayList<String>>,而是傳回 Class<ArrayList>,其並未提供足夠的資訊,讓還原序列化程式正確還原序列化內送郵件。 自訂物件也是如此。

已知的限制

  • 不支援傳輸後援和伺服器傳送的事件傳輸。
  • 不支援傳輸後援和伺服器傳送的事件傳輸。
  • 僅支援 JSON 通訊協定。
  • 僅支援 JSON 通訊協定。
  • 僅支援 WebSockets 傳輸。
  • 尚不支援串流。

其他資源