клиент 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.
- Потоковая передача пока не поддерживается.
Дополнительные ресурсы
ASP.NET Core