Beste praksis for Socket.io med Android

Socket.IO muliggjør sanntid toveis hendelsesbasert kommunikasjon. Den fungerer på alle plattformer, nettlesere eller enheter, med samme fokus på pålitelighet og hastighet. Socket.IO er bygget på toppen av WebSockets API (klientsiden) og NodeJs.

Socket.IO er ikke et WebSocket-bibliotek med tilbakevendingsalternativer til andre sanntidsprotokoller. Det er en tilpasset realtime transportprotokollimplementering på toppen av andre sanntidsprotokoller. Protokollforhandlingsdelene gjør at en klient som støtter standard WebSocket, ikke kan kontakte en Socket.IO-server.
Og en Socket.IO-implementerende klient kan ikke snakke med en ikke-Socket.IO-basert WebSocket- eller Long Polling Comet-server. Derfor krever Socket.IO bruk av Socket.IO-bibliotekene på både klient- og serversiden.

Den offisielle siden sier:

Socket.IO muliggjør sanntid toveis hendelsesbasert kommunikasjon.

Socket.IO gjør det mulig for klienten og serveren å kommunisere i sanntid. Socket.IO NodeJs-serveren definerer hendelsene som skal utløses på en spesifikk rute. Disse hendelsene blir lyttet av server som sendes ut av klienter. Også kan en server avgi en hendelse som en klient kan lytte til.

Socket.IO kan enkelt implementeres via webapper som bruker NodeJs server som back-end. Men i tilfelle Android?

Så har vi et beste bibliotek opprettet av Naoyuki Kanezawa [@nkwaza].
og en av offisiell Socket.IO Github for Android som klient til Socket.IO-server.

Det kommer an på deg hva du vil velge som din personlige preferanse.
0] Socket.Io Android-Java-klient

1] Nkwaza Android Socket.IO-klientbibliotek

du kan bruke en av dem. Jeg vil anbefale deg den andre fordi den er veldig praktisk og ganske enkel å bruke.
Du kan gå gjennom den offisielle bloggen på nettstedet Socket.IO av NKwaza.

For å implementere Socket.IO androidbiblioteket på en perfekt og feilfri måte bør du lese videre.
Det er tre trinn for å implementere SOcket.IO Android Client-bibliotek.

0. Start stikkontakten
1. Koble kontakten til serveren
2. Begynn å sende ut hendelser eller lytte til hendelser

Mange ganger når vi bruker Socket.IO, er problemene generelt sett

1-Feil initialisering og det gir NullPointerExecption.

2- Den rette hendelsen kunne ikke sendes ut og lyttet, da kontakten ikke er tilkoblet.

For å unngå dette, prøv følgende tilnærming.

Helt første trinn Legg til følgende avhengighet i build.gradle-filen på appnivået

implementering ‘com.github.nkzawa: socket.io-client: 0.5.2 '

# 0. Initierer kontakten

For å intialisere stikkontakten oppretter du en -klasse som utvider Application class.

Se kodebiten nedenfor

import android.app.Applikasjon;
import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
import java.net.URISyntaxException;
offentlig klasse RatKiller utvider søknad {
    private Socket mSocket;
    privat statisk endelig String URL = "http://yoururl.com";
    @Overstyring
    public void onCreate () {
        super.onCreate ();
        prøv {
            mSocket = IO.socket (URL);
        } fangst (URISyntaxException e) {
            kaste ny RuntimeException (e);
        }
    }
   public Socket getmSocket () {
     retur mSocket;
   }
}

Her i applikasjonsklassen, erklær en privat variabel socket som vi skal bruke som en referanse du kjenner.
Hjelpemetoden getmSocket () vil returnere socketforekomsten som vi kan bruke i hele prosjektet.

# 1.Koble til kontakten

For å koble socket til server, må vi bruke connect () -metoden på socket-forekomsten returnert fra getmSocket () -metoden.
Inne i MainActivity eller en hvilken som helst aktivitet, legger du til følgende kode i onCreate () -metoden.

offentlig klasse MainActivity utvider AppCompatActivity {
private Socket mSocket;
@Overstyring
beskyttet tomrom onCreate (Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);
RatKiller app = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

For å sjekke om tilkobling er opprettet eller ikke, kan du sjekke ved å bruke tilkoblet () -metode.

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

# 2. Lytt eller avgi hendelse

For å avgi hendelse kan du bruke emit () -metoden. Sendingen () utløser en hendelse på serveren som du skal implementere som et knappeklikk eller et svar på handlinger.

button.setOnCLickListener (Vis-> mSocket.emit ( “drepe”, poisonObject));

For å lytte til spesifikke hendelser sendt av server bruker vi på () metoden. På () -metoden åpner en levert kanal og mottar svaret fra serveren.

mSocket.on ("rat_data", ny Emitter.Listener () {
    @Overstyring
    offentlig ugyldig samtale (Objekt ... args) {
        JSONObject data = (JSONObject) args [0];
// her er dataene i JSON-format
        //Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}
});

Noen ganger må du lytte til responsen fra visse hendelser som klient / app kommer til å utløse enten via knappeklikk eller en hvilken som helst handling utløst osv.
I slike tilfeller kan vi kalle på () -metoden over emit () -metoden. Metoden emit () vil utløse en eller annen hendelse på en bestemt rute / kanal, og på () vil umiddelbart høre svaret som serveren sender.
Du kan oppnå dette ved å gjøre noe som

mSocket.emit ("get_rat_data"). på ("rat_data", ny Emitter.Listener () {
    @Overstyring
    offentlig ugyldig samtale (Objekt ... args) {
        JSONObject data = (JSONObject) args [0];
// data er i JSOn-format
}
});

Data / nyttelast over forespørsel

Data om forespørsel om nyttelast eller forespørsel fra kroppen må sendes i JSON-format til socket. JSON-objektet er inngangsparameteren til emit () -metoden. Java-klassen JSONObject og JSONArray hjelper oss å konstruere et JSON-kroppsformat av dataene.
Du kan gjøre dette som

JSONArray poisonArray = ny JSONArray ();
poisonArray.put (1);
poisonArray.put (2);
JSONObject poisonObject = new JSONObject ();
prøv {
    
    poisonObject.put ( "gift", poisonArray);
} fangst (JSONException e) {
    e.printStackTrace ();
}

Implementering av brukergrensesnittet

Hver gang du mottar dataene som et svar fra serveren, må du oppdatere brukergrensesnittet. For å oppdatere brukergrensesnittet ved å motta mottatte data, må vi utføre all brukergrensesnitt for bindingsgrensesnitt på runOnUiThread () -metoden.

Call () -metoden fra Emmiter.Listener {…} pleide å jobbe på en bakgrunnstråd. Hvis du prøver å kalle UI-spesifikke metoden i samtalen, vil den blåse opp ved å sprenge våre favoritt unntak fra Runtime.
Du kan oppnå dette ved å kalle en runOnUiThread (Runnable r) -metode.

mSocket.emit ("drepe", giftObject) .on ("rat_data", nye Emitter.Listener () {
    @Overstyring
    offentlig ugyldig samtale (Objekt ... args) {
     JSONObject data = (JSONObject) args [0];
// data er i JSOn-format
     runOnUiThread (new Runnable () {
         @Overstyring
         public void run () {
           Toast.makeText (MainActivity.this, "Haha !! Alle rotter blir drept!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ( "0");
          // uansett hvilken UI-logikk du har
         }
     });
    }
});

Og gjort problemet er løst nå. Ja jeg vet! Jeg kommer til å drepe de rottene som løper overalt på gulvet.