ASP.NET Core SignalR Java istemcisi

Tarafından Mikael Mengistu

Java istemcisi, Android uygulamaları da dahil olmak üzere Java kodundan bir ASP.NET Core SignalR sunucusuna bağlanmayı etkinleştirir. JavaScript istemcisi ve .NET istemcisi gibi Java istemcisi de bir hub'a gerçek zamanlı olarak ileti almanızı ve göndermenizi sağlar. Java istemcisi ASP.NET Core 2.2 ve sonraki sürümlerde kullanılabilir.

Bu makalede başvuruda bulunan örnek Java konsol uygulaması Java istemcisini SignalR kullanır.

Örnek kodu görüntüleme veya indirme (indirme)

SignalR Java istemci paketini yükleme

signalr-7.0.0 JAR dosyası istemcilerin hub'lara bağlanmasına SignalR olanak tanır. En son JAR dosyası sürüm numarasını bulmak için Maven arama sonuçlarına bakın.

Gradle kullanıyorsanız build.gradle dosyanızın bölümüne aşağıdaki satırı dependencies ekleyin:

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

Maven kullanıyorsanız, dosyanızın pom.xml öğesinin <dependencies> içine aşağıdaki satırları ekleyin:

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

Hub'a bağlanma

oluşturmak HubConnectionHubConnectionBuilder için , kullanılmalıdır. Bağlantı oluşturulurken hub URL'si ve günlük düzeyi yapılandırılabilir. önce yöntemlerinden buildherhangi birini HubConnectionBuilder çağırarak gerekli seçenekleri yapılandırın. ile startbağlantıyı başlatın.

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

İstemciden çağrı hub'ı yöntemleri

Bir hub yöntemini çağırma çağrısı send . Hub yöntemi adını ve hub yönteminde tanımlanan tüm bağımsız değişkenleri öğesine sendgeçirin.

hubConnection.send("Send", input);

Not

İstemciden hub yöntemlerini çağırmak yalnızca Azure SignalR Hizmeti Varsayılan modda kullanılırken desteklenir. Daha fazla bilgi için bkz . Sık Sorulan Sorular (azure-signalr GitHub deposu).

Hub'dan istemci yöntemlerini çağırma

İstemcide hub'ın çağırabileceği yöntemleri tanımlamak için kullanın hubConnection.on . Derlemeden sonra ancak bağlantıyı başlatmadan önce yöntemleri tanımlayın.

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

Günlüğe kaydetme işlevi ekleme

SignalR Java istemcisi günlük kaydı için SLF4J kitaplığını kullanır. Bu, kitaplık kullanıcılarının belirli bir günlük bağımlılığını getirerek kendi özel günlük uygulamalarını seçmelerine olanak tanıyan üst düzey bir günlük API'sidir. Aşağıdaki kod parçacığında Java istemcisiyle SignalR nasıl kullanılacağı java.util.logging gösterilmektedir.

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

Bağımlılıklarınızda günlüğe kaydetmeyi yapılandırmazsanız, SLF4J aşağıdaki uyarı iletisiyle varsayılan bir işlemsiz günlükçü yükler:

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.

Bu, güvenli bir şekilde yoksayılabilir.

Android geliştirme notları

İstemci özellikleri için SignalR Android SDK uyumluluğuyla ilgili olarak, hedef Android SDK sürümünüzü belirtirken aşağıdaki öğeleri göz önünde bulundurun:

Taşıyıcı belirteci kimlik doğrulamayı yapılandırma

Java istemcisindeSignalR, HttpHubConnectionBuilder'a "erişim belirteci fabrikası" sağlayarak kimlik doğrulaması için kullanılacak taşıyıcı belirteci yapılandırabilirsiniz. RxJava Tek Dizesini> sağlamak içinAccessTokenFactory ile kullanın.< Single.defer çağrısıyla, istemciniz için erişim belirteçleri oluşturmak üzere mantık yazabilirsiniz.

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

Java'da Sınıf bilgilerini geçirme

Java istemcisinde , veya yöntemlerini çağırırkenon, kullanıcılar yönteme geçirilen genel Object bir nesneyi tanımlamak için nesne yerine bir Class<?> nesne geçirmelidirType.HubConnection stream invoke sağlanan Type sınıf kullanılarak TypeReference A elde edilebilir. Örneğin, adlı Foo<T>özel bir genel sınıf kullanıldığında aşağıdaki kod şu kodu Typealır:

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

Temel öğeler veya gibi diğer parametrelenmemiş türler gibi genel olmayan türler için Stringyerleşik .classkullanabilirsiniz.

Bu yöntemlerden birini bir veya daha fazla nesne türüyle çağırırken, yöntemini çağırırken generics söz dizimini kullanın. Örneğin, bir Dize ve Foo<String> nesne bağımsız değişken olarak alan adlı funcbir yöntem için bir işleyici kaydederkenon, bağımsız değişkenleri yazdırmak üzere bir eylem ayarlamak için aşağıdaki kodu kullanın:

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

Java'da tür silme nedeniyle yöntemiyle Object.getClass karmaşık türler hakkında tam bilgi alamadığımız için bu kural gereklidir. Örneğin, üzerinde çağrısı getClass yapmak, Class<ArrayList>gelen iletiyi düzgün bir şekilde seri durumdan çıkarmak için seri durumdan çıkarıcıya yeterli bilgi vermeyen değerini döndürmezClass<ArrayList<String>>.ArrayList<String> Aynı durum özel nesneler için de geçerlidir.

Bilinen sınırlamalar

  • Aktarım geri dönüşü ve Sunucu Tarafından Gönderilen Olaylar aktarımı desteklenmez.
  • Aktarım geri dönüşü ve Sunucu Tarafından Gönderilen Olaylar aktarımı desteklenmez.
  • Yalnızca JSON protokolü desteklenir.
  • Yalnızca JSON protokolü desteklenir.
  • Yalnızca WebSockets aktarımı desteklenir.
  • Akış henüz desteklenmiyor.

Ek kaynaklar