Βέλτιστες πρακτικές του Socket.io με Android

Το Socket.IO επιτρέπει την αμφίδρομη επικοινωνία βασισμένη σε γεγονότα σε πραγματικό χρόνο. Λειτουργεί σε κάθε πλατφόρμα, πρόγραμμα περιήγησης ή συσκευή, εστιάζοντας εξίσου στην αξιοπιστία και την ταχύτητα. Το Socket.IO είναι χτισμένο πάνω από το API WebSockets (πλευρά πελάτη) και το NodeJs.

Το Socket.IO δεν είναι βιβλιοθήκη WebSocket με εναλλακτικές επιλογές σε άλλα πρωτόκολλα σε πραγματικό χρόνο. Πρόκειται για μια προσαρμοσμένη υλοποίηση πρωτοκόλλου μεταφοράς σε πραγματικό χρόνο, πάνω από άλλα πρωτόκολλα σε πραγματικό χρόνο. Τα τμήματα διαπραγμάτευσης πρωτοκόλλου προκαλούν έναν πελάτη που υποστηρίζει το τυπικό WebSocket να μην μπορεί να επικοινωνήσει με ένα διακομιστή Socket.IO.
Και ένας υπολογιστής-πελάτης υλοποίησης Socket.IO δεν μπορεί να μιλήσει με διακομιστή WebSocket ή Long Polling Comet που δεν βασίζεται σε Socket.IO. Επομένως, το Socket.IO απαιτεί τη χρήση των βιβλιοθηκών Socket.IO τόσο από πλευράς πελάτη όσο και από πλευράς διακομιστή.

Ο επίσημος δικτυακός τόπος λέει,

Το Socket.IO επιτρέπει την αμφίδρομη επικοινωνία βασισμένη σε γεγονότα σε πραγματικό χρόνο.

Το Socket.IO επιτρέπει στον πελάτη και τον διακομιστή να επικοινωνούν σε πραγματικό χρόνο. Ο διακομιστής Socket.IO NodeJs ορίζει τα συμβάντα που πρέπει να ενεργοποιηθούν σε μια συγκεκριμένη διαδρομή. Αυτά τα συμβάντα ακούγονται από το διακομιστή και εκπέμπονται από τους clients.Also, ένας διακομιστής μπορεί να εκπέμψει ένα γεγονός στο οποίο ο πελάτης μπορεί να ακούσει.

Το Socket.IO μπορεί εύκολα να εφαρμοστεί μέσω εφαρμογών ιστού χρησιμοποιώντας το διακομιστή NodeJs ως back-end. Αλλά σε περίπτωση Android;

Στη συνέχεια, έχουμε μια καλύτερη βιβλιοθήκη που δημιουργήθηκε από τον Naoyuki Kanezawa [@ nkwaza].
και ένα από το επίσημο Socket.IO Github για το Android ως πελάτης του διακομιστή Socket.IO.

Εξαρτάται από εσάς τι θέλετε να επιλέξετε ως προσωπική σας προτίμηση.
0] Socket.Io πελάτη Android-Java

1] Βιβλιοθήκη πελατών Nkwaza Android Socket.IO

μπορείτε να χρησιμοποιήσετε οποιοδήποτε από αυτά. Θα σας συνιστούσα το δεύτερο επειδή είναι πολύ βολικό και κάπως εύκολο στη χρήση.
Μπορείτε να περάσετε από το επίσημο blog στο site Socket.IO από την NKwaza.

Για να εφαρμόσετε τη βιβλιοθήκη Socket.IO Android σε τέλειο και άψογο τρόπο θα πρέπει να διαβάσετε περαιτέρω.
Υπάρχουν τρία βήματα για την εφαρμογή βιβλιοθήκης SOcket.IO Android Client.

0. Αρχικοποιήστε την υποδοχή
1. Συνδέστε την υποδοχή στο διακομιστή
2. Ξεκινήστε την εκπομπή συμβάντων ή γεγονότων ακρόασης

Πολλές φορές όταν χρησιμοποιούμε το Socket.IO τα προβλήματα που αντιμετωπίζουμε γενικά είναι

1-Εσφαλμένη αρχικοποίηση και δίνει NullPointerExecption.

2- Το σωστό συμβάν δεν θα μπορούσε να εκπέμπεται και να ακούγεται καθώς η πρίζα δεν είναι συνδεδεμένη.

Για να αποφύγετε αυτό δοκιμάστε την ακόλουθη προσέγγιση.

Πολύ πρώτο βήμα Προσθέστε την ακόλουθη εξάρτηση στο αρχείο build.gradle στο επίπεδο εφαρμογής σας

υλοποίηση 'com.github.nkzawa: socket.io-client: 0.5.2'

# 0. Αρχικοποίηση της υποδοχής

Για να εισαγάγετε την υποδοχή δημιουργήστε μια κλάση <όνομα-της αίτησής σας> που επεκτείνει την κλάση εφαρμογής.

Δείτε το απόσπασμα κώδικα παρακάτω

εισαγωγή καιroid.app.Application;
εισαγωγή com.github.nkzawa.socketio.client.IO;
εισαγωγή com.github.nkzawa.socketio.client.Socket;
εισαγωγή java.net.URISyntaxException;
η δημόσια τάξη RatKiller επεκτείνει την εφαρμογή {
    ιδιωτική υποδοχή mSocket;
    ιδιωτική στατική τελική διεύθυνση URL = "http://yoururl.com";
    @Καταπατώ
    δημόσιο κενό onCreate () {
        super.onCreate ();
        προσπαθήστε {
            mSocket = IO.socket (URL);
        } catch (URISyntaxException ε) {
            ρίξει νέα RuntimeException (e);
        }}
    }}
   δημόσια Socket getmSocket () {
     επιστροφή mSocket;
   }}
}}

Εδώ στην τάξη εφαρμογής, δηλώστε μια ιδιωτική μεταβλητή υποδοχή που πρόκειται να χρησιμοποιήσουμε ως αναφορά που γνωρίζετε.
Η μέθοδος helm getmSocket () θα επιστρέψει το στιγμιότυπο που μπορούμε να χρησιμοποιήσουμε σε ολόκληρο το έργο μας.

# 1.Σύνδεση της υποδοχής

Για να συνδέσουμε την πρίζα με το διακομιστή, πρέπει να χρησιμοποιήσουμε τη μέθοδο connect () για την παράσταση socket που επέστρεψε από τη μέθοδο getmSocket ().
Μέσα στο MainActivity ή οποιαδήποτε δραστηριότητα, προσθέστε τον ακόλουθο κώδικα στη μέθοδο onCreate ().

η δημόσια κλάση MainActivity επεκτείνει το AppCompatActivity {
ιδιωτική υποδοχή mSocket;
@Καταπατώ
προστατευμένο κενό onCreate (Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);
Εφαρμογή RatKiller = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}}

Για να ελέγξετε αν η σύνδεση είναι εγκατεστημένη ή όχι, μπορείτε να ελέγξετε χρησιμοποιώντας τη μέθοδο του συνδεδεμένου ().

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

# 2. Ακούστε ή εκπέμπουν συμβάν

Για να εκπέμψετε ένα συμβάν, μπορείτε να χρησιμοποιήσετε τη μέθοδο emit (). Το emit () ενεργοποιεί ένα συμβάν στο διακομιστή που πρόκειται να εκτελέσετε ως κλικ ενός κουμπιού ή σε οποιαδήποτε ενέργεια.

button.setOnCLickListener (δείτε-> mSocket.emit ("kill", poisonObject));

Για να ακούσουμε συγκεκριμένα συμβάντα που στέλνονται από το διακομιστή, χρησιμοποιούμε τη μέθοδο (). Η μέθοδος on () ανοίγει ένα παρεχόμενο κανάλι και λαμβάνει την απάντηση από το διακομιστή.

mSocket.on ("rat_data", νέος Emitter.Listener () {
    @Καταπατώ
    δημόσια κενή κλήση (Object ... args) {
        Δεδομένα JSONObject = (JSONObject) args [0].
// εδώ τα δεδομένα είναι σε μορφή JSON
        //Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}}
});

Μερικές φορές θα πρέπει να ακούσετε την ανταπόκριση ορισμένων γεγονότων που ο πελάτης / εφαρμογή πρόκειται να ενεργοποιήσει είτε με το πάτημα ενός κουμπιού είτε με κάποια ενέργεια που ενεργοποιείται κλπ.
Σε αυτές τις περιπτώσεις, μπορούμε να καλέσουμε τη μέθοδο on () over over emit (). Η μέθοδος emit () θα ενεργοποιήσει κάποιο συμβάν σε συγκεκριμένη διαδρομή / κανάλι και το on () ακούει αμέσως την απάντηση που στέλνει ο διακομιστής.
Μπορείτε να το επιτύχετε κάνοντας κάτι σαν αυτό

mSocket.emit ("get_rat_data") στο ("rat_data", νέο Emitter.Listener () {
    @Καταπατώ
    δημόσια κενή κλήση (Object ... args) {
        Δεδομένα JSONObject = (JSONObject) args [0].
// τα δεδομένα είναι σε μορφή JSOn
}}
});

Δεδομένα / φορτίο κατόπιν αιτήματος

Το φορτίο φόρτωσης αίτησης ή τα στοιχεία του οργανισμού αίτησης πρέπει να αποστέλλονται σε μορφή JSON στην υποδοχή. Το αντικείμενο JSON είναι η παράμετρος εισόδου της μεθόδου emit (). Η κλάση JSONObject και JSONArray της Java μας βοηθά να κατασκευάσουμε μια μορφή σώματος JSON των δεδομένων.
Μπορείτε να το κάνετε αυτό ως

JSONArray poisonArray = νέο JSONArray ();
poisonArray.put (1);
poisonArray.put (2);
JSONObject poisonObject = νέο JSONObject ();
προσπαθήστε {
    
    poisonObject.put ("δηλητήρια", poisonArray);
} catch (JSONException e) {
    e.printStackTrace ();
}}

Εφαρμογή του UI

Κάθε φορά που λαμβάνετε τα δεδομένα ως απόκριση από το διακομιστή, πρέπει να ενημερώσετε το περιβάλλον χρήστη. Για να ενημερώσουμε το UI χρησιμοποιώντας ληφθέντα δεδομένα, πρέπει να εκτελέσουμε όλη τη λογική δέσμευσης UI στη μέθοδο runOnUiThread ().

Η μέθοδος κλήσης () από το Emmiter.Listener {...} χρησιμοποιείται για την εργασία σε ένα νήμα φόντου. Αν προσπαθήσετε να καλέσετε τη συγκεκριμένη μέθοδο UI μέσα στην κλήση, θα ανατινάξει ανατίναξη των αγαπημένων εξαιρέσεων χρόνου εκτέλεσης.
Μπορείτε να το επιτύχετε καλώντας μια μέθοδο runOnUiThread (Runnable r).

mSocket.emit ("kill", poisonObject) .on ("rat_data", νέα έκδοση Emitter.Listener () {
    @Καταπατώ
    δημόσια κενή κλήση (Object ... args) {
     Δεδομένα JSONObject = (JSONObject) args [0].
// τα δεδομένα είναι σε μορφή JSOn
     runOnUiThread (νέο Runnable () {
         @Καταπατώ
         δημόσιο κενό εκτέλεσης () {
           Toast.makeText (MainActivity.this, "Haha! Όλοι οι αρουραίοι σκοτώνονται!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ("0");
          // ανεξάρτητα από τη λογική του UI σας
         }}
     });
    }}
});

Και το πρόβλημα λύθηκε τώρα. Ναι, ξέρω! Θα σκοτώσω εκείνους τους Ποντικούς που τρέχουν παντού στο πάτωμα.