Android uygulamasında hangi WebSocket kitaplığı kullanılmalı? [kapalı]


131

Android uygulamama bir WebSocket bağlantısı ile arka planda çalışan (muhtemelen birkaç saat veya hatta günden fazla) ve düzenli olarak bir sunucuya bazı veriler gönderen bir Hizmet eklemek istiyorum .

Şimdi Java için bir sürü WebSocket kitaplığı var gibi görünüyor ve hangisini kullanmam gerektiğinden emin değilim:

Ek olarak, Android için yerel bir socket.io istemci kitaplığı vardır:

  • nkzawa / socket.io-client.java GitHub'dan açıklama: Socket.IO v1.0 ve üstü ile uyumlu Java için tam özellikli Socket.IO İstemci Kitaplığı.

Socket.io Android istemcisini kullanmak benim için kullanışlı olurdu, çünkü yine de web ön ucu için nodejs / socket.io kullanmayı planlıyorum. Ancak yerli müşteri oldukça genç ve birkaç açık sorunu var. Ve buna ek olarak, anladığım kadarıyla, bir android uygulamasının socket.io istemci kitaplığını kullanmanın (socket.io 1.0 sunucusuyla uyumlu olmasının dışında) herhangi bir yararı yoktur, çünkü WebSocket desteği istemci tarafında sağlanabilir. .

Gereksinimlerim aşağıdaki gibidir:

  • Android API 9 ve üstü ile uyumluluk
  • SSL ile bağlanma imkanı
  • Kalıcı bir uyandırma kilidi tutmak zorunda kalmadan bağlantıyı uzun süre koruyun
  • Kullanılabilir bir nodejs websocket sunucu uygulamasıyla veya socket.io ile uyumluluk

Bu gereksinimler için hangisinin doğru kitaplık olduğuna dair herhangi bir öneriniz var mı?


Belki Atmosfer . Bu Soruya bakın .
Basil Bourque

2
WebSocket veya Atmosphere konusunda uzman değilim. Yalnızca Atmosphere'in iyi giyildiğini ve WebSocket desteği dahil olmak üzere Push özellikleri için birçok projede kullanıldığını biliyorum . Benim tek deneyimim, Vaadin web uygulamaları oluşturmada dolaylı . Vaadin, otomatik İtme özelliği için Atmosphere kullanıyor. Ancak dikkatli olun, WebSocket kısa tarihi boyunca tanımında, özelliklerinde ve çeşitli uygulamalarda yapılan birçok değişiklikle hala nispeten yenidir. Öyleyse, nasıl giderseniz gidin "sorunları" bekleyin.
Basil Bourque

2
Bilginize, Autobahn dışarıda ve gösterişli bir web sitesine sahipler. Ancak, siz onu yüklemek ve çalıştırmak için zaman harcayana kadar "güvenli WebSocketlerin uygulanmadığına" dikkat edin. Sonraki.
cloudurfin

1
Yorum yapmak için yeterli itibarım yok, bu yüzden sorunuzda belirttiğiniz gerekliliklerin aynısını uyguladığım ve okhttp tüm gereksinimleri karşılamama yardımcı olduğu için cevap olarak yazıyorum. 3.5 sürümünün piyasaya sürülmesinden bu yana web soketlerini destekler, bu nedenle okHttp (web servis çağrıları + web soketleri desteği) kullanmak için ek bir avantajdır. İşte başlamak için bağlantı. < medium.com/@ssaurel/… >
Kaleem Patel

7
Bunun gibi sorular kapatılmamalıdır.
Martin Berger

Yanıtlar:


123

Bazı notlar.

  • koush / AndroidAsync , RFC 6455'in gerektirdiği kapanış anlaşmasını gerçekleştirmez . Bkz bu detaylar için.

  • Project Tyrus Android'de çalışır, ancak lisansının ( CPE ile CDDL 1.1 ve GPL 2 ) ve boyutunun ( ProGuard ile WebSocket istemci kavanoz boyutunu azaltma ) gereksinimlerinizi karşıladığından emin olun. Ayrıca, bir metin boyutu büyük olduğunda (muhtemelen bir hatadır) Tyrus'un bir istisna oluşturabileceğini unutmayın. Bkz bu detaylar için.

  • İskele : İskele kullanıcıları posta listesindeki 2 yıl önceki bir e - posta iş parçacığı "Şu anda Android uyumlu Jetty 9 WebSocket istemcimiz yok. Jetty WebSocket İstemcisini Android için JDK 7'den JDK 5 / 6'ya geri yükleme girişiminde bulunma planları var kullanın, ancak JSR-356 Java WebSocket API (javax.websocket) uygulamamızı bitirmekten daha düşük bir önceliktir. " Jetty'nin WebSocket İstemci API'si hakkındaki mevcut belgesinde Android hakkında hiçbir şey belirtilmiyor.

  • codebutler / android-websocket , RFC 6455 için gerekli olan kapanış anlaşmasını gerçekleştirmez ve kapanışta bir istisna oluşturabilir. Bunu gör .

  • Atmosphere / wasync , WebSocket uygulaması olarak AsyncHttpClient / async-http-client kullanır . Bu nedenle, bunun yerine AsyncHttpClient / async-http-client belirtilmelidir.

  • firebase / TubeSock doğrulamıyor Sec-WebSocket-Accept. Bu, RFC 6455'e karşı bir ihlaldir . Ayrıca, TubeSock'un bir metin mesajı oluşturmada bir hatası var. Metin mesajları için çok baytlı UTF-8 karakterleri kullanırsanız, hatayla er ya da geç karşılaşacaksınız. Bkz Sorun 3 yılında zevk-im / Android-DDP TubeSock sorunları hakkında uzun bir liste için.

Değerlendirme Noktaları

Java ile yazılmış bir WebSocket istemci uygulamasını seçerken dikkat edilecek noktalar:

  1. Uyumluluk . Az sayıda uygulama RFC 6455'in gerektirdiği kapanış anlaşmasını uygulamaz . (Kapanış tokalaşma uygulanmadı ne olur? Bkz bu .)
  2. Gerekli Java sürümü . Java SE 5, 6, 7, 8 veya Java EE? Android'de bile çalışıyor mu?
  3. Boyut . Bazı uygulamaların birçok bağımlılığı vardır.
  4. wss desteği.
  5. HTTP proxy desteği.
  6. HTTP proxy desteği üzerinden wss . Bir WebSocket istemci kitaplığının HTTP proxy üzerinden wss'yi desteklemek için yapması gerekenler hakkında HTML5 Web Soketlerinin Proxy Sunucularıyla Nasıl Etkileşimde Bulunur başlıklı bölümündeki Şekil 2'ye bakın .
  7. SSL yapılandırmasında esneklik . SSLSocketFactoryve SSLContextgereksiz kısıtlamalar olmaksızın kullanılabilmelidir.
  8. Temel Kimlik Doğrulama dahil açılış anlaşmasındaki özel HTTP üstbilgileri .
  9. Proxy sunucusunda kimlik doğrulama dahil olmak üzere, HTTP proxy anlaşmasında özel HTTP üstbilgileri .
  10. Tüm çerçeve türlerini (devamı, ikili, metin, kapat, ping ve pong) gönderebilir veya gönderemez. Çoğu uygulama, geliştiricilere parçalanmış çerçeveler ve istenmeyen pong çerçevelerini manuel olarak gönderme araçları sağlamaz .
  11. Çeşitli WebSocket olaylarını almak için dinleyici arayüzü . Zayıf bir arayüz, geliştiricileri hayal kırıklığına uğratır. Zengin bir arayüz, geliştiricilerin sağlam uygulamalar yazmasına yardımcı olur.
  12. WebSocket durumunu sorgulayabilir veya edemez. RFC 6455 , BAĞLANMA, AÇMA, KAPATMA ve KAPATMA durumlarını tanımlar, ancak çok az uygulama iç durum geçişlerini tanımlanmış şekilde korur.
  13. Soket bağlantısı için bir zaman aşımı değeri belirlenebilir . ( Metodun ikinci argümanına eşdeğer )Socket.connect(SocketAddress endpoint, int timeout)
  14. Temeldeki ham sokete erişebilir .
  15. Sezgisel, kullanımı kolay API ya da değil.
  16. İyi belgelenmiş ya da değil.
  17. RFC 7692 (WebSocket için Sıkıştırma Uzantıları) desteği (diğer adıyla permessage-deflate).
  18. Yeniden yönlendirme (3xx) desteği.
  19. Özet Kimlik Doğrulama desteği.

nv-websocket-client , son ikisi dışında yukarıdakilerin tümünü kapsar. Ek olarak, küçük ama kullanışlı özelliklerinden biri de periyodik olarak ping / pong çerçeveleri göndermektir. SadecesetPingInterval/setPongIntervalyöntemleriniçağırarak elde edilebilir(Bkz. JavaDoc ).

Feragatname: Takahiko Kawasaki nv-websocket-client'ın yazarıdır.


1
nv-websocket-client kitaplığı hala geliştirme aşamasında mı? TooTallNate / Java-WebSockets ile 1006 hatasıyla otomatik bağlantı kesilmesi sorunuyla karşılaştım ve YOK nedeni .. bu nv-websocket da sorunu çözüyor mu?
Ankit Bansal

1
1006'ya gelince, belirtim (RFC 6455), kodun bir Son nokta tarafından bir Kapat denetim çerçevesinde bir durum kodu olarak AYARLANMAMASI GEREKİR . Bu, kodun istemci tarafında oluşturulduğu anlamına gelir. WebSocketListeneronDisconnected yöntemi ve onErroryöntemi aracılığıyla bağlantı kesilmesi hakkında daha fazla bilgi edinebilirsiniz . yöntem size bir örnek verir . Sorunun ne olduğunu görmek için yöntemini çağırın . onErrorWebSocketExceptiongetError()
Takahiko Kawasaki

7
Wss için okhttp ve autobahn'ı denedim (ayrıca bu cevapta kendini tanıtma şüphesi var). Autobahn kolaydı, ancak SSL yok. OkHttp'de sıfırdan sıfıra (birleştirilmiş) belgeler vardır (Şubat 2016). Kodlarını ve istisnalarını okumak için çok zaman harcadım çünkü çıplak kemik örneğinin çalışmasını sağlamak için geçici çözümlere (zaman aşımını 0 olarak ayarlamak veya gelen mesajı kapatmak gibi) bilmiyordum. Bu ikisini (ve hayal kırıklığımı) atarak, nv'yi (canlandırıcı bir şekilde) iyi belgelenmiş buldum; telaşsız çalıştı.
cloudurfin

1
Square / okhttp'nin yeni websockets desteği hakkında herhangi bir fikriniz var mı? medium.com/square-corner-blog/…
scorpiodawg

2
OkHttp ile ilgili ayrıntıları bilmiyorum. Üzgünüm, Authlete, Inc.'in kurucusu olarak çok meşgulüm (" API güvenlik başlangıcı Authlete, tohum fonu için 1,2 milyon dolar topladı ") OkHttp'yi incelemek ve değerlendirme noktaları listesini güncellemek için zaman ayıramıyorum. Cevabımdan sonraki değişikliklerle ilgili olarak, CHANGES.md'ye bakın . Lütfen nv-websocket-client'ın sadece hobim olduğunu ve OkHttp'nin 138 katılımcısı olan büyük bir proje olduğunu unutmayın.
Takahiko Kawasaki

4

Diğer bazı hususlar:

Tyrus Android'de çalışıyor. Ancak, Android 5.0'da kullandığı SSL kitaplıkları hatalı ve SSL anlaşmalarında başarısız oluyor . Bunun Android'in daha yeni sürümlerinde düzeltilmesi gerekiyor, ancak Android'in birçok cihazda güncellenmemesi nedeniyle bu sizin için bir sorun olabilir.

SSL'nin diğer websocket uygulamaları için nasıl uygulandığına bağlı olarak, bu da bir sorun olabilir.

AndroidAsync'de bu SSL sorunu yok. Zaman aşımlarını ayarlayamama gibi başka sorunları da var .


3

a) Bu dosyayı gradle dosyasına ekleyin

compile 'com.github.nkzawa:socket.io-client:0.3.0'

b) Bu satırları Uygulama Etkinliğine ekleyin:

    public class MyApplication extends Application {
     private Socket mSocket;
        {
            try {
               mSocket = IO.socket(Config.getBaseURL());

            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }

        public Socket getSocket() {
            return mSocket;
        }
}

c) Bu işlevi, WebSocket adını verdiğiniz etkinliğinize ekleyin:

     private void websocketConnection() {
            //Get websocket from application
            MyApplication app = (MyApplication ) getApplication();
            mSocket = app.getSocket();
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
            mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
            mSocket.on("messageFromServer", onNewLocation);
            mSocket.connect();
        } 


    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(() -> {
                if (!isConnected) {

                    RequestSocket mRequestSocket = new RequestSocket();

                    mRequestSocket.setToken("anil_singhania");
                   /* your parameter */
                    mSocket.emit("messageFromClient", new Gson().toJson(mRequestSocket));
                    Log.i("Socket Data", new Gson().toJson(mRequestSocket));
                    isConnected = true;
                }
            });
        }
    };

    private Emitter.Listener onDisconnect = args -> runOnUiThread(() -> {
        isConnected = false;
       /* Toast.makeText(getApplicationContext(),
                R.string.disconnect, Toast.LENGTH_LONG).show();*/
    });

    private Emitter.Listener onConnectError = args -> runOnUiThread(() -> {
         /*   Toast.makeText(getApplicationContext(),
            R.string.error_connect, Toast.LENGTH_LONG).show()*/
    });

    private Emitter.Listener onNewLocation = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            runOnUiThread(() -> {


            });
        }
    };

Bu, ws: // protokolünü desteklemez.
Girish Butiya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.