Saya ingin menambahkan Layanan ke aplikasi Android saya yang berjalan di latar belakang memegang koneksi WebSocket (mungkin lebih dari beberapa jam atau bahkan berhari-hari) dan secara teratur mengirimkan beberapa data ke server.
Sekarang tampaknya ada banyak perpustakaan WebSocket untuk Java, dan saya tidak yakin yang mana yang harus saya gunakan:
TooTallNate / Java-WebSocket Deskripsi dari GitHub: Klien barebones dan implementasi server WebSocket ditulis dalam Java 100%. http://java-websocket.org/ - Yang ini terhubung dengan hasil pertama saya di googling "android websocket" . Namun, ada beberapa masalah terbuka, terutama tentang koneksi SSL, dan tampaknya tidak dipelihara secara aktif saat ini.
koush / AndroidAsync Deskripsi dari GitHub: Asynchronous socket, http (client + server), websocket, dan socket.io library untuk android. Berdasarkan nio, bukan utas. - Lagi-lagi banyak masalah terbuka, tetapi tampaknya tetap dipelihara / dikerjakan.
Deskripsi Proyek Tyrus dari Situs Web: JSR 356: Java API for WebSocket - Implementasi Referensi - Ini dibuat oleh Oracle. Tidak yakin apakah itu berfungsi di Android.
Info API Klien Jetty WebSocket dari Situs Web: Jetty juga menyediakan Perpustakaan Klien Jetty WebSocket untuk menulis membuat berbicara dengan server WebSocket lebih mudah. - Lagi: Tidak yakin apakah itu berfungsi di Android.
codebutler / android-websockets Deskripsi dari GitHub: Klien websockets minimal (hybi13 / RFC) untuk Android - Yang ini digunakan dalam contoh schwiz / android-websocket , yang merupakan jawaban yang diterima untuk pertanyaan StackOverflow " Bagaimana membuat Perangkat Android memegang koneksi TCP ke Internet tanpa kunci bangun? "
Atmosphere / wasync Deskripsi dari GitHub: WebSockets dengan fallback mengangkut pustaka klien untuk Node.js, Android dan Java http://async-io.org
TakahikoKawasaki / nv-websocket-client Deskripsi dari GitHub: Implementasi klien WebSocket berkualitas tinggi di Jawa.
square / okhttp Deskripsi dari GitHub: Klien HTTP + SPDY untuk aplikasi Android dan Java. http://square.github.io/okhttp/ -
Ini memiliki modul Websocket .Seperti yang disebutkan oleh scorpiodawg , OkHttp memiliki dukungan websocket bawaan sejak versi 3.5.firebase / TubeSock Deskripsi dari GitHub: Pustaka klien WebSocket diimplementasikan di Jawa
Autobahn | Android ( GitHub ) Deskripsi dari Situs web: Autobahn | Android adalah pustaka jaringan open-source untuk Java / Android yang dibuat oleh proyek Autobahn yang mengimplementasikan Protokol WebSocket dan Protokol Perpesanan Aplikasi Web (WAMP) untuk membuat WebSocket / WAMP yang asli untuk seluler klien. - cloudsurfin menunjukkan bahwa ini tidak memiliki dukungan untuk wss.
Selain itu, ada perpustakaan klien socket.io asli untuk Android:
- nkzawa / socket.io-client.java Deskripsi dari GitHub: Perpustakaan Klien Socket.IO berfitur lengkap untuk Java, yang kompatibel dengan Socket.IO v1.0 dan yang lebih baru.
Untuk menggunakan klien socket.io Android akan berguna bagi saya, karena saya berencana untuk menggunakan nodejs / socket.io untuk antarmuka web. Tetapi klien asli cukup muda dan memiliki beberapa masalah terbuka. Dan di samping itu, saya memahami bahwa aplikasi android tidak memiliki manfaat menggunakan perpustakaan klien socket.io (selain tidak kompatibel dengan server socket.io 1.0), karena dukungan WebSocket dapat dijamin di sisi klien .
Persyaratan saya adalah sebagai berikut:
- Kompatibilitas dengan Android API 9 dan lebih tinggi
- Kemungkinan untuk terhubung melalui SSL
- Simpan koneksi untuk waktu yang lama tanpa harus memegang wakelock permanen
- Kompatibilitas dengan implementasi server nodejs websocket yang tersedia atau dengan socket.io
Adakah saran yang merupakan pustaka yang tepat untuk persyaratan ini?
Jawaban:
Beberapa catatan.
koush / AndroidAsync tidak melakukan jabat tangan penutup yang diperlukan oleh RFC 6455 . Lihat ini untuk detailnya.
Project Tyrus bekerja di Android, tetapi pastikan lisensi ( CDDL 1.1 dan GPL 2 dengan CPE ) dan ukurannya ( Mengurangi ukuran tabung klien WebSocket dengan ProGuard ) memenuhi persyaratan Anda. Perhatikan juga bahwa Tyrus dapat membuat pengecualian ketika ukuran teks besar (itu mungkin bug). Lihat ini untuk detailnya.
Jetty : Utas email 2 tahun yang lalu di milis pengguna jetty mengatakan, "Kami saat ini tidak memiliki klien WebSocket Jetty 9 yang kompatibel dengan Android. Ada rencana untuk mencoba untuk mendukung Klien WebSocket Jetty dari JDK 7 hingga JDK 5/6 untuk android gunakan, tapi ini prioritas yang lebih rendah daripada menyelesaikan implementasi JSR-356 Java WebSocket API kami (javax.websocket). " Dokumen Jetty tentang WebSocket Client API saat ini tidak menyebutkan apa pun tentang Android.
codebutler / android-websocket tidak melakukan jabat tangan penutup yang diperlukan oleh RFC 6455 dan dapat melempar pengecualian pada penutupan. Lihat ini .
Atmosphere / wasync menggunakan AsyncHttpClient / async-http-client sebagai implementasi WebSocket-nya. Jadi, lebih tepatnya, AsyncHttpClient / async-http-client harus disebutkan sebagai gantinya.
firebase / TubeSock tidak memverifikasi
Sec-WebSocket-Accept
. Ini merupakan pelanggaran terhadap RFC 6455 . TubeSock juga memiliki bug dalam membangun pesan teks. Anda akan menemukan bug cepat atau lambat jika Anda menggunakan multi-byte karakter UTF-8 untuk pesan teks. Lihat Edisi 3 di senang-im / Android-DDP untuk daftar panjang tentang masalah TubeSock.Poin Pertimbangan
Poin pertimbangan dalam memilih implementasi klien WebSocket yang ditulis dalam Java:
SSLSocketFactory
danSSLContext
harus dapat digunakan tanpa batasan yang tidak perlu.Socket.connect(SocketAddress endpoint, int timeout)
nv-websocket-client mencakup semua hal di atas kecuali dua yang terakhir. Selain itu, salah satu fitur kecil namun praktis adalah mengirim bingkai ping / pong secara berkala. Itu dapat dicapai hanya dengan memanggil
setPingInterval
/setPongInterval
metode (Lihat JavaDoc ).Penafian: Takahiko Kawasaki adalah penulis nv-websocket-client.
sumber
onDisconnected
metode danonError
metode WebSocketListener .onError
Metode memberi Anda sebuahWebSocketException
contoh. PanggilgetError()
metodenya untuk melihat apa masalahnya.Beberapa pertimbangan lain:
Tyrus bekerja di Android. Namun, pustaka SSL yang digunakannya di Android 5.0 buggy dan gagal handshake SSL . Ini seharusnya diperbaiki di versi Android yang lebih baru, tetapi dengan cara Android tidak diperbarui pada banyak perangkat, ini mungkin menjadi masalah bagi Anda.
Bergantung pada bagaimana SSL diterapkan untuk implementasi websocket lain, ini juga bisa menjadi masalah.
AndroidAsync tidak memiliki masalah SSL ini. Itu memang memiliki masalah lain seperti tidak dapat mengatur batas waktu .
sumber
a) Tambahkan file ini dalam file gradle
compile 'com.github.nkzawa:socket.io-client:0.3.0'
b) Tambahkan baris ini di Aktivitas Aplikasi:
c) Tambahkan fungsi ini ke aktivitas Anda, tempat Anda memanggil WebSocket:
sumber