ASP.NET Core SignalR Java 客户端

作者:Mikael Mengistu

此 Java 客户端支持通过 Java 代码连接到 ASP.NET Core SignalR 服务器(包括 Android 应用)。 与 JavaScript 客户端.NET 客户端 一样,Java 客户端支持实时接收消息并发送到中心。 ASP.NET Core 2.2 及更高版本支持 Java 客户端。

本文中引用的示例 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 服务时才支持从客户端调用中心方法。 有关详细信息,请参阅常见问题解答(azure-signalr GitHub 存储库)

从中心调用客户端方法

使用 hubConnection.on 在客户端上定义中心可以调用的方法。 在生成之后,启动连接之前定义方法。

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

添加日志记录

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志 API,允许库的用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段显示了如何将 java.util.logging 与 SignalR Java 客户端配合使用。

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 提供 RxJava Single<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 传输。
  • 尚不支持流式传输。

其他资源