клиент Java для ASP.NET Core SignalR

Авторы: Микаэль Менгисту (Mikael Mengistu)

Клиент Java позволяет подключаться к серверу ASP.NET Core SignalR из кода Java, включая приложения Android. Как и клиент JavaScript и клиент .NET, клиент Java позволяет получать и отправлять сообщения в концентратор в режиме реального времени. Клиент Java доступен в ASP.NET Core 2.2 и более поздних версий.

Пример консольного приложения Java, на которое ссылается в этой статье, использует SignalR клиент Java.

Просмотреть или скачать образец кода (описание загрузки)

Установка клиентского SignalR пакета Java

signalrJAR-файл -7.0.0 позволяет клиентам подключаться к SignalR центрам. Сведения о последнем номере версии JAR-файла см. в результатах поиска Maven.

При использовании Gradle добавьте следующую строку в dependencies раздел файла build.gradle :

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-адрес концентратора и уровень журнала. Настройте все необходимые параметры путем вызова любого из HubConnectionBuilder методов до build. Запустите подключение с start.

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

Методы концентратора вызовов из клиента

Вызов вызова send метода концентратора. Передайте имя метода концентратора и все аргументы, определенные в методе sendконцентратора.

hubConnection.send("Send", input);

Примечание.

Вызов методов концентратора из клиента поддерживается только при использовании службы Azure SignalR в режиме по умолчанию . Дополнительные сведения см. в статье "Часто задаваемые вопросы" (репозиторий Azure-GitHubsignalr).

Вызов клиентских методов из концентратора

Используется 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

В отношении совместимости пакета SDK для Android для SignalR клиентских функций следует учитывать следующие элементы при указании целевой версии пакета SDK для Android:

  • SignalR Клиент Java будет работать на уровне API Android 16 и более поздних версий.
  • Для подключения через службу Azure SignalR потребуется уровень API Android 20 и более поздних версий, так как служба Azure SignalR требует TLS 1.2 и не поддерживает наборы шифров на основе SHA-1. Android добавил поддержку наборов шифров SHA-256 (и выше) на уровне API 20.

Настройка проверки подлинности маркера носителя

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив "фабрику маркеров доступа" httpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

Передача сведений о классе в Java

При вызове onметода invokeили stream методах HubConnection в клиенте Java пользователи должны передать Type объект, а не Class<?> объект, чтобы описать любой универсальный Object метод. Его Type можно получить с помощью предоставленного TypeReference класса. Например, используя настраиваемый универсальный класс с именем Foo<T>, следующий код получает Typeследующий код:

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

Для не универсальных типов, таких как примитивы или другие не параметризованные типы String, можно просто использовать встроенные .class.

При вызове одного из этих методов с одним или несколькими типами объектов используйте синтаксис универсальных элементов при вызове метода. Например, при регистрации обработчика on для именованного funcметода, который принимает в качестве аргументов строку и Foo<String> объект, используйте следующий код, чтобы задать действие для печати аргументов:

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

Это соглашение необходимо, так как мы не можем получить полные сведения о сложных типах с методом Object.getClass из-за стирки типов в Java. Например, вызов getClass ArrayList<String> не вернет Class<ArrayList<String>>, а не Class<ArrayList>дает десериализатору достаточно информации, чтобы правильно десериализировать входящее сообщение. То же самое верно для пользовательских объектов.

Известные ограничения

  • Резервный вариант транспорта и транспорт отправленных событий сервера не поддерживается.
  • Резервный вариант транспорта и транспорт отправленных событий сервера не поддерживается.
  • Поддерживается только протокол JSON.
  • Поддерживается только протокол JSON.
  • Поддерживается только транспорт WebSockets.
  • Потоковая передача пока не поддерживается.

Дополнительные ресурсы