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
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
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.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:
- O SignalR Java Client será executado na API Android Nível 16 e posterior.
- A conexão por meio do Serviço de SignalR do Azure exigirá o Nível 20 da API do Android e posterior porque o Azure SignalR Service requer TLS 1.2 e não oferece suporte a pacotes de codificação baseados em SHA-1. O Android adicionou suporte para suites de cifra SHA-256 (e superiores) no Nível 20 da API.
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
, invoke
ou 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 .class
incorporado.
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.