Partilhar via


ASP.NET Core SignalR cliente Java

Por Mikael Mengistu

O cliente Java permite conectar-se a um servidor ASP.NET Core SignalR a partir do código Java, incluindo aplicativos Android. Como o do cliente JavaScript e odo cliente .NET , o cliente Java permite que você receba e envie mensagens para um hub em tempo real. O cliente Java está disponível no ASP.NET Core 2.2 e posterior.

O aplicativo de console Java de exemplo mencionado neste artigo usa o cliente Java SignalR.

Ver ou baixar código de exemplo (como descarregar)

Instalar o pacote do cliente SignalR Java

O signalr-7.0.0 arquivo JAR permite que os clientes se conectem a SignalR hubs. Para encontrar o número de versão mais recente do arquivo JAR, consulte os resultados da pesquisa Maven.

Se estiver usando o Gradle, adicione a seguinte linha à seção do arquivo build.gradle do :

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

Se estiver usando o Maven, adicione as seguintes linhas dentro do elemento <dependencies> do seu arquivo pom.xml:

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

Conectar-se a um hub

Para estabelecer um HubConnection, deve ser utilizado o HubConnectionBuilder. A URL do hub e o nível de log podem ser configurados durante a criação de uma conexão. Configure todas as opções necessárias chamando qualquer um dos métodos HubConnectionBuilder antes de build. Inicie a conexão com start.

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

Chamar métodos do hub a partir do cliente

Uma chamada para send invoca um método hub. Passe o nome do método hub e quaisquer argumentos definidos no método hub para send.

hubConnection.send("Send", input);

Observação

A chamada de métodos de hub a partir de um cliente só é suportada ao utilizar o Serviço SignalR do Azure no modo Padrão. Para obter mais informações, consulte Perguntas freqüentes (repositório GitHub azure-signalr).

Chamar métodos de cliente a partir do hub

Use hubConnection.on para definir métodos no cliente que o hub pode chamar. Defina os métodos após a construção, mas antes de iniciar a conexão.

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

Adicionar registo

O cliente Java usa a biblioteca SLF4J para registro. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.

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

Se você não configurar o registro em log em suas dependências, o SLF4J carregará um registrador sem operação padrão com a seguinte mensagem de aviso:

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.

Isso pode ser ignorado com segurança.

Notas de desenvolvimento do Android

Com relação à compatibilidade do SDK do Android para os recursos do cliente SignalR, considere os seguintes itens ao especificar sua versão do SDK do Android de destino:

Configurar autenticação de token de portador

No cliente Java SignalR, você pode configurar um token do tipo bearer para usar na autenticação, fornecendo uma "fábrica de tokens de acesso" para o HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.

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

Passando informações de classe em Java

Ao chamar os métodos on, invokeou stream de HubConnection no cliente Java, os usuários devem passar um objeto Type em vez de um objeto Class<?> para descrever qualquer Object genérico passado para o método. Uma Type pode ser adquirida usando a classe TypeReference fornecida. Por exemplo, usando uma classe genérica personalizada chamada Foo<T>, o código a seguir obtém o Type:

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

Para tipos não-genéricos, tais como primitivos ou outros tipos não parametrizados, como String, poderás simplesmente recorrer ao .classincorporado.

Ao chamar um desses métodos com um ou mais tipos de objeto, use a sintaxe genérica ao invocar o método. Por exemplo, ao registrar um manipulador de on para um método chamado func, que usa como argumentos um objeto String e um objeto Foo<String>, use o código a seguir para definir uma ação para imprimir os argumentos:

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

Esta convenção é necessária porque não podemos recuperar informações completas sobre tipos complexos com o método Object.getClass devido à eliminação de tipos em Java. Por exemplo, chamar getClass em um ArrayList<String> não retornaria Class<ArrayList<String>>, mas sim Class<ArrayList>, que não fornece ao desserializador informações suficientes para desserializar corretamente uma mensagem de entrada. O mesmo vale para objetos personalizados.

Limitações conhecidas

  • Não há suporte para fallback do transporte e para o transporte de Eventos Enviados pelo Servidor (Server-Sent Events).
  • Não há suporte para mecanismo de reserva de transporte e o transporte de Eventos Enviados pelo Servidor.
  • Apenas o protocolo JSON é suportado.
  • Apenas o protocolo JSON é suportado.
  • Somente o transporte WebSockets é suportado.
  • O streaming ainda não é suportado.

Recursos adicionais