Best practices van Socket.io met Android

Socket.IO maakt real-time bidirectionele op gebeurtenissen gebaseerde communicatie mogelijk. Het werkt op elk platform, elke browser of elk apparaat en richt zich evenzeer op betrouwbaarheid en snelheid. Socket.IO is gebouwd bovenop de WebSockets API (clientzijde) en NodeJs.

Socket.IO is geen WebSocket-bibliotheek met fallback-opties voor andere realtime-protocollen. Het is een aangepaste realtime transportprotocol-implementatie bovenop andere realtime-protocollen. De protocolonderhandelingsonderdelen zorgen ervoor dat een client die standaard WebSocket ondersteunt, geen contact kan maken met een Socket.IO-server.
En een Socket.IO-implementerende client kan niet praten met een niet op Socket.IO gebaseerde WebSocket- of Long Polling Comet-server. Daarom vereist Socket.IO het gebruik van de Socket.IO-bibliotheken aan zowel client- als serverzijde.

De officiële site zegt:

Socket.IO maakt real-time bidirectionele op gebeurtenissen gebaseerde communicatie mogelijk.

Met de Socket.IO kunnen client en server in realtime communiceren. De Socket.IO NodeJs-server definieert de gebeurtenissen die op een specifieke route moeten worden geactiveerd. Deze gebeurtenissen worden door de server beluisterd en door clients uitgezonden. Een server kan ook een gebeurtenis verzenden waarnaar een client kan luisteren.

De Socket.IO kan eenvoudig worden geïmplementeerd via webapps met de NodeJs-server als back-end. Maar in het geval van Android?

Dan hebben we een beste bibliotheek gemaakt door Naoyuki Kanezawa [@nkwaza].
en één door officiële Socket.IO Github voor Android als client van Socket.IO-server.

Het hangt van u af wat u wilt kiezen als uw persoonlijke voorkeur.
0] Socket.Io Android-Java-client

1] Nkwaza Android Socket.IO-clientbibliotheek

u kunt beide gebruiken. Ik zou je de tweede willen aanbevelen, omdat deze erg handig en een beetje gemakkelijk te gebruiken is.
U kunt door de officiële blog op de Socket.IO-site van NKwaza gaan.

Lees verder om de Android-bibliotheek Socket.IO op een perfecte en perfecte manier te implementeren.
Er zijn drie stappen voor het implementeren van SOcket.IO Android Client-bibliotheek.

0. Initialiseer de socket
1. Verbind de socket met de server
2. Begin met het uitzenden van evenementen of het luisteren naar evenementen

Vaak gebruiken we Socket.IO als problemen

1 - Onjuiste initialisatie en dit geeft NullPointerExecption.

2- De juiste gebeurtenis kon niet worden uitgezonden en beluisterd omdat de aansluiting niet is aangesloten.

Probeer de volgende aanpak om dit te voorkomen.

De eerste stap Voeg de volgende afhankelijkheid toe aan het build.gradle-bestand op app-niveau

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

# 0. De socket initialiseren

Om de socket te initialiseren, maakt u een klasse die de toepassingsklasse uitbreidt.

Zie het codefragment hieronder

android.app.Application importeren;
import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
java.net.URISyntaxException importeren;
openbare klasse RatKiller verlengt toepassing {
    privé Socket mSocket;
    private statische finale String URL = "http://yoururl.com";
    @ Override
    openbare nietig op onCreate () {
        super.onCreate ();
        proberen {
            mSocket = IO.socket (URL);
        } vangst (URISyntaxException e) {
            gooi nieuwe RuntimeException (e);
        }
    }
   public Socket getmSocket () {
     terugkeer mSocket;
   }
}

Verklaar hier in de toepassingsklasse een privévariabele socket die we als referentie gaan gebruiken.
De hulpmethode getmSocket () retourneert de socketinstantie die we in ons hele project kunnen gebruiken.

# 1.Het stopcontact aansluiten

Om de socket met de server te verbinden, moeten we de methode connect () gebruiken op de socketinstantie die wordt geretourneerd door de methode getmSocket ().
Voeg in uw MainActivity of een activiteit de volgende code toe in de methode onCreate ().

openbare klasse MainActivity breidt AppCompatActivity uit {
privé Socket mSocket;
@ Override
beschermde ongeldige onCreate (bundle saveInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);
RatKiller app = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

Om te controleren of er een verbinding tot stand is gebracht, kunt u dit controleren met behulp van de methode connected ().

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

# 2. Luister of zend evenement uit

Om een ​​gebeurtenis uit te zenden, kunt u de methode emit () gebruiken. Emit () activeert een gebeurtenis op de server die u gaat implementeren als een klik op een knop of een reactie op een actie.

button.setOnCLickListener (Beeld-> mSocket.emit ( “kill”, poisonObject));

Om specifieke gebeurtenissen te beluisteren die door de server zijn verzonden, gebruiken we de methode on (). De methode on () opent een beschikbaar kanaal en ontvangt het antwoord van de server.

mSocket.on ("rat_data", nieuwe Emitter.Listener () {
    @ Override
    openbare nietige oproep (Object ... args) {
        JSONObject data = (JSONObject) args [0];
// hier zijn de gegevens in JSON-indeling
        //Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}
});

Soms moet je luisteren naar de reactie van bepaalde gebeurtenissen die door de client / app worden geactiveerd via een klik op de knop of een actie die wordt geactiveerd, enz.
In dergelijke gevallen kunnen we de methode on () over emit () aanroepen. De methode emit () activeert een gebeurtenis op een specifieke route / kanaal en de functie on () luistert onmiddellijk naar de reactie die door de server is verzonden.
Je kunt dit bereiken door zoiets te doen

mSocket.emit ("get_rat_data"). on ("rat_data", nieuwe Emitter.Listener () {
    @ Override
    openbare nietige oproep (Object ... args) {
        JSONObject data = (JSONObject) args [0];
// gegevens zijn in JSOn-indeling
}
});

Gegevens / lading over verzoek

De payload van het verzoek of de bodygegevens van het verzoek moeten in JSON-formaat naar de socket worden verzonden. Het JSON-object is de invoerparameter van de methode emit (). De klasse JSONObject en JSONArray van Java helpt ons bij het samenstellen van een JSON-indeling van de gegevens.
Je kunt dit als

JSONArray poisonArray = new JSONArray ();
poisonArray.put (1);
poisonArray.put (2);
JSONObject poisonObject = new JSONObject ();
proberen {
    
    poisonObject.put ( "vergiften", poisonArray);
} catch (JSONException e) {
    e.printStackTrace ();
}

De UI implementeren

Telkens wanneer u de gegevens ontvangt als reactie van de server, moet u uw gebruikersinterface bijwerken. Om de gebruikersinterface bij te werken met behulp van ontvangen gegevens moeten we alle UI-bindlogica uitvoeren op de methode runOnUiThread ().

De methode call () van Emmiter.Listener {…} werkte vroeger op een achtergrondthread. Als je de UI-specifieke methode in de aanroep probeert aan te roepen, wordt deze opgeblazen door onze favoriete Runtime-uitzonderingen op te blazen.
U kunt dit bereiken door een methode runOnUiThread (Runnable r) aan te roepen.

mSocket.emit ("kill", poisonObject) .on ("rat_data", nieuwe Emitter.Listener () {
    @ Override
    openbare nietige oproep (Object ... args) {
     JSONObject data = (JSONObject) args [0];
// gegevens zijn in JSOn-indeling
     runOnUiThread (new Runnable () {
         @ Override
         openbare ongeldige run () {
           Toast.makeText (MainActivity.this, "Haha !! Alle ratten worden gedood!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ( "0");
          // ongeacht uw UI-logica
         }
     });
    }
});

En klaar is het probleem nu opgelost. Ja ik weet het! Ik ga die ratten doden die overal op de vloer rondrennen.