Socket.io-ning Android-ning eng yaxshi amaliyotlari

Socket.IO real vaqt rejimida voqealarga asoslangan ikki tomonlama aloqani ta'minlaydi. U har qanday platformada, brauzerda yoki qurilmalarda ishonchlilik va tezlikka teng e'tibor qaratib ishlaydi. Socket.IO WebSockets API (mijoz tomoni) va NodeJ-larning ustiga qurilgan.

Socket.IO boshqa real vaqt protokollariga o'tish imkoniyatiga ega bo'lgan WebSocket kutubxonasi emas. Bu boshqa real vaqt protokollarining ustiga o'rnatilgan maxsus vaqt rejimidagi transport protokoli. Protokolning muzokarali qismlari standart WebSocket-ni qo'llab-quvvatlaydigan mijozning Socket.IO serveriga murojaat qila olmasligiga olib keladi.
Va Socket.IO dasturini amalga oshiruvchi mijoz, Socket.IO asosidagi bo'lmagan WebSocket yoki Long Polling Comet serveri bilan gaplasha olmaydi. Shuning uchun, Socket.IO Socket.IO kutubxonalaridan mijoz va server tomonidan foydalanishni talab qiladi.

Rasmiy saytda aytilishicha,

Socket.IO real vaqt rejimida voqealarga asoslangan ikki tomonlama aloqani ta'minlaydi.

Socket.IO mijoz va serverga real vaqt rejimida muloqot qilish imkoniyatini beradi. Socket.IO NodeJs serveri ma'lum marshrutda qo'zg'atilishi kerak bo'lgan hodisalarni belgilaydi. Ushbu hodisalar mijozlar chiqargan server tomonidan tinglanadi. Shuningdek, server mijoz tinglashi mumkin bo'lgan hodisani chiqarishi mumkin.

Socket.IO-ni osonlikcha NodeJs serveridan foydalanib veb-ilovalar orqali amalga oshirish mumkin. Ammo Android holatida?

Keyin bizda Naoyuki Kanezawa [@nkwaza] tomonidan yaratilgan eng yaxshi kutubxona mavjud.
va bittasini rasmiy Socket.IO Github android uchun Socket.IO serverining mijozi sifatida.

Bu sizning shaxsiy xohishingiz sifatida nimani tanlashni xohlashingiz sizga bog'liq.
0] Socket.Io Android-Java mijozi

1] Nkwaza Android Socket.IO mijozlar kutubxonasi

ulardan ikkalasidan ham foydalanishingiz mumkin. Ikkinchisini tavsiya qilaman, chunki foydalanish juda qulay va qarindosh.
Siz NKwaza tomonidan Socket.IO saytidagi rasmiy blog orqali o'tishingiz mumkin.

Socket.IO android kutubxonasini mukammal va benuqson tarzda bajarish uchun qo'shimcha o'qish kerak.
SOcket.IO Android Client kutubxonasini amalga oshirish uchun uchta qadam mavjud.

0. Soketni boshlang
1. Soketni serverga ulang
2. Hodisalarni chiqarishni yoki voqealarni tinglashni boshlang

Socket.IO-dan foydalanganda ko'p duch keladigan muammolar mavjud

1-noto'g'ri initsializatsiya va u NullPointerExecption-ni beradi.

2- Tegishli hodisani rozetkaga ulanmaganligi sababli chiqarib bo'lmaydi va tinglash mumkin emas.

Buning oldini olish uchun quyidagi yondashuvni sinab ko'ring.

Juda birinchi qadam Ilova darajasidagi build.gradle fayliga quyidagi bog'liqlikni qo'shing

amalga oshirish 'com.github.nkzawa: socket.io-client: 0.5.2'

# 0. Soketni ishga tushirish

Soketni intializatsiya qilish uchun "Ilova-ning nomi"> sinfini yarating, bu esa Ilovalar sinfini kengaytiradi.

Kod parchasini quyida ko'ring

import android.app.Application;
import com.github.nkzawa.socketio.client.IO;
com.github.nkzawa.socketio.client.Socket-ni import qilish;
import java.net.URISyntaxException;
jamoat klassi RatKiller dasturni kengaytiradi {
    xususiy Socket mSocket;
    shaxsiy statik final String URL = "http://yoururl.com";
    @Hamma safar
    jamoat bo'shlig'i onCreate () {
        super.onCreate ();
        urinib ko'ring {
            mSocket = IO.socket (URL);
        } catch (URISyntaxException e) {
            yangi RuntimeException (e) ni tashlang;
        }
    }
   public Socket getmSocket () {
     qaytish mSocket;
   }
}

Ilova sinfida, biz siz biladigan ma'lumot sifatida foydalanmoqchi bo'lgan shaxsiy o'zgaruvchan soketni e'lon qiling.
GetmSocket () yordamchi usuli butun loyihamizda foydalanishimiz mumkin bo'lgan soket namunasini qaytaradi.

# 1.Soketni ulash

Soketni serverga ulash uchun getmSocket () usulidan qaytarilgan soket inventarida ulanish () usulidan foydalanishimiz kerak.
MainActivity yoki har qanday faoliyatingizda onCreate () usuliga quyidagi kodni qo'shing.

jamoat sinfidagi MainActivity AppCompatActivity-ni kengaytiradi {
xususiy Socket mSocket;
@Hamma safar
onCreate-ning himoyalangan bo'shligi (to'plami saqlanganInstanceState) {
    super.onCreate (saqlanganInstanceState);
    setContentView (R.layout.activity_main);
RatKiller app = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

Ulanish o'rnatilganmi yoki yo'qligini tekshirish uchun siz ulangan () usuli yordamida tekshirishingiz mumkin.

if (mSocket.connected ()) {
  Toast.makeText (MainActivity.this, "Ulangan !!", Toast.LENGTH_SHORT) .show ();
 }

№2. Tinglang yoki chiqaring

Hodisani chiqarish uchun siz emit () metodidan foydalanishingiz mumkin. Emit () tugmachani bosish yoki biron-bir javob harakati sifatida amalga oshirmoqchi bo'lgan serverda hodisani qo'zg'atadi.

button.setOnCLickListener (view-> mSocket.emit ("o'ldirish", zahObject));

Server tomonidan yuborilgan aniq voqealarni tinglash uchun biz () usulidan foydalanamiz. On () usuli taqdim etilgan kanalni ochadi va serverdan javob oladi.

mSocket.on ("rat_data", yangi Emitter.Listener () {
    @Hamma safar
    ommaviy bo'sh chaqiriq (Object ... args) {
        JSONObject data = (JSONObject) args [0];
// bu erda ma'lumotlar JSON Format-da
        // Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}
});

Ba'zan, mijoz tugmachani bosish orqali yoki biron-bir harakatni ishga tushirish orqali mijoz / ilova ishga tushiradigan ba'zi bir hodisalarning javobini tinglashingiz kerak.
Bunday holatlarda biz () usulni emit () usuli orqali chaqirishimiz mumkin. Emit () usuli ma'lum bir marshrut / kanalda biron bir hodisani qo'zg'atadi va on () darhol server tomonidan yuborilgan javobni tinglaydi.
Siz shunga o'xshash narsalarni qilish orqali bunga erishishingiz mumkin

mSocket.emit ("get_rat_data"). yoqilgan ("rat_data", yangi Emitter.Listener () {
    @Hamma safar
    ommaviy bo'sh chaqiriq (Object ... args) {
        JSONObject data = (JSONObject) args [0];
// ma'lumotlar JSOn formatida
}
});

So'rov bo'yicha ma'lumotlar / to'lovlar

So‘rov yuklamasi yoki so‘rov tana ma’lumotlari rozetkaga JSON formatida yuborilishi kerak. JSON ob'ekti emit () usulining kirish parametridir. Java-ning JSONObject va JSONArray sinfi bizga ma'lumotlarning JSON formatini yaratishda yordam beradi.
Buni quyidagicha qilishingiz mumkin

JSONArray zahArray = yangi JSONArray ();
zahArray.put (1);
zahArray.put (2);
JSONObject zahObject = yangi JSONObject ();
urinib ko'ring {
    
    zahObject.put ("zahar", zaharArray);
} qo'lga olish (JSONException e) {
    e.printStackTrace ();
}

UIni amalga oshirish

Har safar serverdan javob sifatida ma'lumotlarni olganingizda, UI-ni yangilashingiz kerak bo'ladi. Qabul qilingan ma'lumotlardan foydalanib foydalanuvchi interfeysini yangilash uchun barcha UI ulanish mantig'ini runOnUiThread () usulida bajarishimiz kerak.

Emmiter.Listener {...} dan qo'ng'iroq () usuli orqa fonda ishlashda ishlatiladi. Agar siz qo'ng'iroq ichida UI-ning o'ziga xos usulini chaqirishga harakat qilsangiz, u bizning sevimli Runtime istisnolarini o'chirib portlaydi.
Bunga RunOnUiThread (Runnable r) usulini chaqirish orqali erishish mumkin.

mSocket.emit ("o'ldir", zahObject) .on ("rat_data", yangi Emitter.Listener () {
    @Hamma safar
    ommaviy bo'sh chaqiriq (Object ... args) {
     JSONObject data = (JSONObject) args [0];
// ma'lumotlar JSOn formatida
     runOnUiThread (yangi Runnable () {
         @Hamma safar
         public void run () {
           Toast.makeText (MainActivity.this, "Haha !! Barcha kalamushlar o'ldirildi!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ("0");
          // sizning UI mantig'ingiz qanday bo'lishidan qat'iy nazar
         }
     });
    }
});

Muammo hal qilindi. Ha men bilaman! Men hamma joyda yugurayotgan kalamushlarni o'ldiraman.