ASP.NET Core SignalR Java 클라이언트

작성자: Mikael Mengistu

Java 클라이언트를 사용하면 Android 앱을 포함하여 Java 코드에서 ASP.NET Core SignalR 서버에 연결할 수 있습니다. 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을 사용하는 경우 파일 요소 내에 <dependencies> 다음 줄을 추가합니다 pom.xml .

<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 Service를 사용하는 경우에만 지원됩니다.SignalR 자세한 내용은 질문과 대답(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 클라이언트에서 on, invoke 또는 HubConnectionstream 메서드를 호출할 때 사용자는 메서드에 전달된 제네릭 Object를 설명하기 위해 Class<?> 개체 대신 Type 개체를 전달해야 합니다. 제공된 TypeReference 클래스를 사용하여 Type을 획득할 수 있습니다. 예를 들어 Foo<T>라는 사용자 지정 제네릭 클래스를 사용하여 다음 코드는 Type을 가져옵니다.

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

기본 형식 또는 매개 변수가 없는 다른 형식(예: String)과 같은 제네릭이 아닌 경우 기본 제공 .class를 사용하면 됩니다.

하나 이상의 개체 형식을 사용하여 이러한 메서드 중 하나를 호출하는 경우 메서드를 호출할 때 제네릭 구문을 사용합니다. 예를 들어 문자열 및 Foo<String> 개체를 인수로 사용하는 func라는 메서드에 대한 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>가 반환되므로 들어오는 메시지를 올바르게 역직렬화할 수 있는 충분한 정보를 역직렬 변환기에 제공하지 않습니다. 사용자 지정 개체의 경우도 마찬가지입니다.

알려진 제한 사항

  • 전송 대체 및 Server Sent 이벤트 전송은 지원되지 않습니다.
  • 전송 대체 및 Server Sent 이벤트 전송은 지원되지 않습니다.
  • JSON 프로토콜만 지원됩니다.
  • JSON 프로토콜만 지원됩니다.
  • WebSocket 전송만 지원됩니다.
  • 스트리밍은 아직 지원되지 않습니다.

추가 리소스