Το WebSocket είναι μια ολοκληρωμένη τεχνολογία σε πολλές σύγχρονες διαδικτυακές εφαρμογές. Εάν γράφετε κώδικα για τον Ιστό, πιθανότατα έχετε ακούσει τον όρο πριν, αλλά ίσως δεν είστε σίγουροι τι ακριβώς είναι ή πώς να τον χρησιμοποιήσετε. Ευτυχώς, το WebSocket δεν είναι μια περίπλοκη έννοια και μπορείτε να την κατανοήσετε αρκετά γρήγορα.
Τι είναι το WebSocket;
Το WebSocket, δυστυχώς, είναι ένα από εκείνα τα ονόματα που δεν φαίνεται να έχουν νόημα με την πρώτη ματιά. WebSocket είναι στην πραγματικότητα το όνομα του α πρωτόκολλο επικοινωνίας που επιτρέπει την αμφίδρομη επικοινωνία μεταξύ του πελάτη και του διακομιστή web.
Με απλούστερους όρους, το WebSocket είναι μια τεχνολογία που επιτρέπει σε έναν πελάτη και έναν διακομιστή να δημιουργήσουν μια σύνδεση όπου κάθε μέρος μπορεί να στείλει ένα μήνυμα στο άλλο ανά πάσα στιγμή.
Αυτό διαφέρει από μια κανονική σύνδεση HTTP, όπου ο πελάτης πρέπει να ξεκινήσει ένα αίτημα και μόνο τότε ο διακομιστής μπορεί να στείλει μια απάντηση. Στην πραγματικότητα, το WebSocket είναι ένα εντελώς διαφορετικό πρωτόκολλο επικοινωνίας από το HTTP που σχεδιάστηκε για να είναι συμβατό με HTTP. Όταν μια εφαρμογή πελάτη θέλει να ξεκινήσει μια σύνδεση WebSocket, πρέπει να χρησιμοποιήσει το
Μηχανισμός αναβάθμισης HTTP για μετάβαση στο πρωτόκολλο WebSocket.Σε αυτό το σημείο, μπορεί να σκέφτεστε: "ένα πρωτόκολλο είναι απλώς ένα σύνολο κανόνων, πώς μπορείτε να το χρησιμοποιήσετε για να κωδικοποιήσετε;".
Το κομμάτι που λείπει είναι κάτι που ονομάζεται α στοίβα πρωτοκόλλου. Ουσιαστικά, οι συσκευές που υποστηρίζουν ένα πρωτόκολλο έχουν ενσωματωμένο υλικό και λογισμικό που σας επιτρέπουν να γράφετε εφαρμογές που επικοινωνούν χρησιμοποιώντας το πρωτόκολλο. Το πρωτόκολλο δεν χρησιμοποιείται απευθείας για να δημιουργήσει τίποτα.
Γιατί δημιουργήθηκε το WebSocket;
Για να δείξετε την ανάγκη για WebSocket, εξετάστε τον μηχανισμό πίσω από τη συνομιλία στο Διαδίκτυο.
Κάποιος στέλνει ένα μήνυμα στον διακομιστή συνομιλίας από τη συσκευή του, αλλά ο διακομιστής πρέπει να στείλει αυτό το μήνυμα στη συσκευή σας για να μπορέσετε να το διαβάσετε. Εάν ο διακομιστής χρησιμοποιεί HTTP, ο διακομιστής δεν μπορεί να προωθήσει απευθείας αυτό το μήνυμα σε εσάς, επειδή ο διακομιστής δεν μπορεί να εκκινήσει αιτήματα.
Υπάρχουν μερικοί τρόποι για να διορθώσετε αυτό το πρόβλημα με το HTTP. Ένας τρόπος είναι ο πελάτης να στέλνει συνεχώς αιτήματα ενημέρωσης στον διακομιστή και ο διακομιστής θα προωθήσει τα δεδομένα που έχει στην απόκριση. Αυτή η τεχνική ονομάζεται δημοσκόπηση και κάθε αίτημα ονομάζεται δημοσκόπηση. Υπάρχουν δύο παραλλαγές δημοσκόπησης: μακροχρόνια ψηφοφορία και σύντομη ψηφοφορία.
Η χρήση της παραλλαγής μεγάλης ψηφοφορίας σημαίνει ότι η συσκευή-πελάτης ρωτά συνεχώς τον διακομιστή εάν υπάρχουν διαθέσιμα νέα μηνύματα. Εάν είναι διαθέσιμα νέα μηνύματα, ο διακομιστής θα στείλει τα μηνύματα ως απάντηση. Εάν όχι, ο διακομιστής θα καθυστερούσε να απαντήσει και θα κρατούσε ανοιχτή τη σύνδεση έως ότου είχε δεδομένα για αποστολή και, στη συνέχεια, ο πελάτης θα έκανε αμέσως νέο αίτημα.
Αυτή η τεχνική είναι αναποτελεσματική, επειδή το HTTP δεν έχει σχεδιαστεί για να χρησιμοποιείται με αυτόν τον τρόπο. Λειτουργεί επαρκώς σε μικρή κλίμακα, αλλά κάθε αίτημα HTTP περιλαμβάνει την αποστολή επιπλέον δεδομένων στο κεφαλίδα και οδηγεί σε σημαντικά αυξημένο φόρτο στον διακομιστή όταν πολλοί πελάτες πραγματοποιούν δημοσκόπηση το.
Ακολουθεί ένα διάγραμμα που απεικονίζει μεγάλη δημοσκόπηση:
Η παραλλαγή σύντομης ψηφοφορίας είναι ακόμη λιγότερο αποτελεσματική. Εν συντομία, ο διακομιστής δεν κρατά τη σύνδεση ανοιχτή έως ότου υπάρξουν νέα δεδομένα, που σημαίνει ότι ο πελάτης πρέπει να συνεχίσει να ψηφίζει τον διακομιστή σε σταθερά, πολύ σύντομα διαστήματα.
Μια άλλη τεχνική για αμφίδρομη επικοινωνία στο HTTP ονομάζεται ροή.
Στη ροή, μετά την αποστολή του πρώτου αιτήματος, ο διακομιστής διατηρεί τη σύνδεση ανοιχτή επ' αόριστον, στέλνοντας νέες πληροφορίες ως συνεχείς μερικές αποκρίσεις στον πελάτη.
Η χρήση ροής έχει ως αποτέλεσμα μικρότερη επιβάρυνση δεδομένων και φόρτο διακομιστή από ό, τι η ψηφοφορία, επειδή στην ιδανική περίπτωση ο πελάτης κάνει μόνο ένα αίτημα HTTP. Δυστυχώς, η ροή δημιουργεί προβλήματα υπό ορισμένες συνθήκες, επειδή τα προγράμματα περιήγησης και οι μεσάζοντες δικτύου (όπως οι διακομιστές μεσολάβησης) συχνά προσπαθούν να χειριστούν το μερικές αποκρίσεις ως σπασμένα κομμάτια μιας μεγάλης απόκρισης HTTP (που είναι φυσιολογική συμπεριφορά HTTP), αντί ως ξεχωριστά μηνύματα που προορίζονταν να είναι.
Το WebSocket δημιουργήθηκε για να λύσει αυτά τα ζητήματα. Σε αντίθεση με το HTTP, το WebSocket σχεδιάστηκε ειδικά για αμφίδρομη επικοινωνία. Με το WebSocket, μόλις ανοίξει μια σύνδεση, ο πελάτης και ο διακομιστής μπορούν να στέλνουν μηνύματα εμπρός και πίσω χωρίς προβλήματα ψηφοφορίας ή ροής.
Χρησιμοποιήστε τις θήκες για WebSocket
Το WebSocket είναι υπέροχο, αλλά αυτό δεν σημαίνει ότι πρέπει να χρησιμοποιείται παντού.
Η εφαρμογή του WebSocket μπορεί να προσθέσει πολυπλοκότητα στην εφαρμογή σας, ειδικά από την πλευρά του διακομιστή, επομένως δεν θα πρέπει να γίνει αν δεν έχετε καλό λόγο. Αυτό θέτει το ερώτημα: πώς μοιάζει ένας καλός λόγος;
Το WebSocket είναι ιδανικό για περιπτώσεις χρήσης όπου απαιτείται συχνή αμφίδρομη επικοινωνία σε χαμηλή καθυστέρηση. Με άλλα λόγια, το WebSocket παρέχει ένα πλεονέκτημα για εφαρμογές που πρέπει να επικοινωνούν συχνά ή σε μεγάλη κλίμακα. Εάν η επικοινωνία δεν χρειάζεται να είναι σε πραγματικό χρόνο ή η εφαρμογή δεν θα αναπτυχθεί ποτέ σε μεγάλη κλίμακα, η δημοσκόπηση ή η ροή μπορεί να είναι επαρκής για χρήση σε αυτήν την εφαρμογή.
Τυπικές χρήσεις του WebSocket είναι στη δημιουργία εφαρμογών συνομιλίας, διαδικτυακά παιχνίδια για πολλούς παίκτες, σε πραγματικό χρόνο συνεργασίας και λογισμικού ειδοποιήσεων κ.λπ.
Πώς να χρησιμοποιήσετε το WebSocket στην πλευρά του πελάτη
Η χρήση του WebSocket από την πλευρά του διακομιστή μπορεί μάλλον να εμπλέκεται και η διαδικασία ποικίλλει σημαντικά ανάλογα με τη γλώσσα (όπως ΝΤΟ#, Ιάβα, κ.λπ.) και βιβλιοθήκη επιλογής, επομένως δεν θα το καλύψουμε εδώ. Στη συνέχεια, θα συζητήσουμε εν συντομία πώς να χρησιμοποιήσετε το WebSocket στην πλευρά του πελάτη.
Όλα τα σύγχρονα προγράμματα περιήγησης εφαρμόζουν ένα web API που ονομάζεται το WebSocket API, που είναι η στοίβα πρωτοκόλλου του προγράμματος περιήγησης για το πρωτόκολλο WebSocket. Μπορείτε να χρησιμοποιήσετε το WebSocket σε JavaScript χρησιμοποιώντας αυτό το API. Το API σάς επιτρέπει να δημιουργήσετε ένα αντικείμενο WebSocket, μέσω του οποίου δημιουργείτε μια σύνδεση WebSocket και αλληλεπιδράτε με τον διακομιστή WebSocket.
Μπορείτε να χρησιμοποιήσετε την ακόλουθη μορφή κώδικα για να δημιουργήσετε ένα αντικείμενο WebSocket:
ας exampleSocket = νέο WebSocket("wss://www.example.com/socketserver", "εικονικό Πρωτόκολλο");
Το πρώτο όρισμα για τον κατασκευαστή είναι το URI του διακομιστή WebSocket με τον οποίο θέλετε να δημιουργήσετε μια σύνδεση. Θα ξεκινά πάντα με "ws" ή "wss". Το δεύτερο όρισμα είναι προαιρετικό. Η τιμή του είναι είτε μια συμβολοσειρά είτε μια σειρά από συμβολοσειρές, η οποία καθορίζει τα υποπρωτόκολλα που υποστηρίζετε.
Το αντικείμενο WebSocket έχει μια ιδιότητα μόνο για ανάγνωση που ονομάζεται readyState. Η πρόσβαση σε αυτήν την ιδιότητα παρέχει την τρέχουσα κατάσταση της σύνδεσης WebSocket. Το readyState έχει τέσσερις πιθανές τιμές: "connecting", "open", "closing" και "closed".
Όταν εκτελείται αυτή η γραμμή κώδικα, το πρόγραμμα περιήγησης θα προσπαθήσει να συνδεθεί στον καθορισμένο διακομιστή. Η σύνδεση δεν θα ολοκληρωθεί αμέσως, επομένως το readyState του exampleSocket θα "συνδέεται". Δεν μπορούν να σταλούν ή να ληφθούν μηνύματα μέχρι να ολοκληρωθεί η σύνδεση, οπότε η τιμή του readyState θα γίνει "ανοιχτή".
ο παράδειγμα Socket Το αντικείμενο έχει έναν ακροατή συμβάντων (που είναι διαφορετικός από Ακροατές συμβάντων DOM) που ονομάζεται "onopen" και σας επιτρέπει να εκτελέσετε περαιτέρω ενέργειες μόνο αφού δημιουργηθεί η σύνδεση. Το αντικείμενο έχει επίσης μια μέθοδο "αποστολής" που σας επιτρέπει να στέλνετε συμβολοσειρές, Blobs (δυαδικά δεδομένα) και ArrayBuffers ως μηνύματα στον διακομιστή.
Ακολουθεί ένα παράδειγμα που χρησιμοποιεί αυτά μαζί:
exampleSocket.onopen = λειτουργία (Εκδήλωση) {
exampleSocket.send("Το WebSocket είναι πραγματικά υπέροχο");
};
Το API παρέχει επίσης έναν τρόπο για να μπορείτε να αντιδράτε στα μηνύματα που στέλνει ο διακομιστής. Αυτό γίνεται με το πρόγραμμα ακρόασης συμβάντων "onmessage". Εδώ είναι ένα παράδειγμα:
exampleSocket.onmessage = λειτουργία (Εκδήλωση) {
κονσόλα.κούτσουρο(Εκδήλωση.δεδομένα);
}
Αντίθετα, μπορείτε επίσης να γράψετε μια συνάρτηση βέλους:
exampleSocket.onmessage = (γεγονός) => { κονσόλα.log (event.data); }
Το API παρέχει επίσης ένα Κλείσε() μέθοδος για να κλείσετε τη σύνδεση. Δείτε πώς φαίνεται:
παράδειγμα Socket.Κλείσε();
Το WebSocket επιτρέπει την αποτελεσματική αμφίδρομη επικοινωνία
Το WebSocket είναι ένα πρωτόκολλο αμφίδρομης επικοινωνίας. Οι διακομιστές και τα προγράμματα περιήγησης εφαρμόζουν στοίβες πρωτοκόλλων για να επικοινωνούν χρησιμοποιώντας το WebSocket. Το WebSocket υπάρχει επειδή το HTTP δεν έχει σχεδιαστεί για να είναι αμφίδρομο. Υπάρχουν μέθοδοι για την υλοποίηση αμφίδρομων συνδέσεων με HTTP, αλλά έχουν προβλήματα.
Το WebSocket είναι ισχυρή τεχνολογία, αλλά δεν είναι απαραίτητο σε όλες τις περιπτώσεις, καθώς μπορεί να περιπλέξει σημαντικά την αρχιτεκτονική εφαρμογών. Η χρήση του WebSocket στην πλευρά του πελάτη γίνεται με το πρόγραμμα περιήγησης WebSocket API.