WebSocket — ένα πρωτόκολλο πλήρους αμφίδρομης επικοινωνίας που παρέχει μόνιμη σύνδεση μεταξύ πελάτη και διακομιστή για ανταλλαγή δεδομένων σε πραγματικό χρόνο. Σε αντίθεση με τα παραδοσιακά αιτήματα HTTP, αυτό το πρωτόκολλο δημιουργεί μία μόνο σύνδεση και τη χρησιμοποιεί για αμφίδρομη μετάδοση χωρίς επαναλαμβανόμενες χειραψίες. Σύμφωνα με το Mozilla Developer Network (2025), το WebSocket μειώνει τις καθυστερήσεις έως και 50% σε σύγκριση με το HTTP polling σε εφαρμογές πραγματικού χρόνου.
Κύρια σημεία
WebSocket — είναι ένα πρωτόκολλο επικοινωνίας που λειτουργεί μέσω TCP και παρέχει ένα πλήρους αμφίδρομης κανάλι μεταξύ πελάτη και διακομιστή. Τυποποιήθηκε από τον IETF ως RFC 6455 το 2011 και υποστηρίζεται από όλα τα σύγχρονα προγράμματα περιήγησης, πλατφόρμες κινητών και πλαίσια διακομιστή.
Σε αντίθεση με το HTTP, όπου ο πελάτης ξεκινά ένα αίτημα και λαμβάνει μια απάντηση, το WebSocket επιτρέπει και στα δύο μέρη να στέλνουν μηνύματα ανά πάσα στιγμή μετά τη δημιουργία της σύνδεσης. Αυτό το καθιστά ιδανικό για σενάρια που απαιτούν άμεση παράδοση δεδομένων: συνομιλίες, ειδοποιήσεις, συνεργατική επεξεργασία εγγράφων.
Το πρωτόκολλο WebSocket χρησιμοποιεί τη θύρα HTTP 80 ή τη θύρα HTTPS 443 για την αρχική χειραψία, μετά από την οποία μεταβαίνει στο δικό του πρωτόκολλο με ελάχιστη κεφαλίδα — μόλις 2 byte αντί για 800+ byte στο HTTP. Αυτό το χαρακτηριστικό δίνει σημαντικό πλεονέκτημα απόδοσης σε μεγάλο αριθμό μηνυμάτων.
Η σύνδεση WebSocket ξεκινά με ένα αίτημα HTTP Upgrade, μετά το οποίο το πρωτόκολλο μεταβαίνει σε δυαδική μορφή πλαισίου. Το μέγεθος του πλαισίου κυμαίνεται από 2 byte έως 2^63 byte, επιτρέποντας τη μετάδοση τόσο σύντομων μηνυμάτων κειμένου όσο και μεγάλων δυαδικών δεδομένων. Υποστηρίζεται η κατάτμηση μηνυμάτων, η κάλυψη δεδομένων από τον πελάτη προς τον διακομιστή και ping/pong για τη διατήρηση της σύνδεσης.
Η διαδικασία δημιουργίας σύνδεσης WebSocket αποτελείται από δύο στάδια: χειραψία και μετάδοση δεδομένων. Στο στάδιο της χειραψίας, ο πελάτης στέλνει ένα αίτημα HTTP με την κεφαλίδα Upgrade: websocket και ο διακομιστής επιβεβαιώνει την αλλαγή πρωτοκόλλου με κατάσταση 101 Switching Protocols. Μετά από αυτό, η σύνδεση μεταβαίνει σε λειτουργία πλήρους αμφίδρομης μετάδοσης.
Κάθε μήνυμα στο WebSocket χωρίζεται σε πλαίσια. Το πλαίσιο περιέχει opcode (κείμενο, δυαδικά δεδομένα, κλείσιμο, ping/pong), μήκος ωφέλιμου φορτίου και κλειδί κάλυψης για δεδομένα από τον πελάτη. Το πλαίσιο μπορεί να κατατμηθεί — τα πλαίσια ελέγχου (ping/pong) μπορούν να μεταδοθούν μεταξύ τμημάτων μηνύματος, αποτρέποντας τη διακοπή της σύνδεσης κατά τη μεγάλη μετάδοση.
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('Σύνδεση εγκαταστάθηκε')
ws.send('Γεια σου διακομιστή!')
})
ws.addEventListener('message', (event) => {
console.log('Λήφθηκε:', event.data)
})
ws.addEventListener('close', () => {
console.log('Σύνδεση έκλεισε')
})
Στο παραπάνω παράδειγμα, ο πελάτης δημιουργεί ένα αντικείμενο WebSocket, προσδιορίζοντας το ασφαλές URL wss://. Μετά το άνοιγμα της σύνδεσης, αποστέλλεται ένα μήνυμα χαιρετισμού και ο χειριστής message λαμβάνει απαντήσεις από τον διακομιστή. Κατά το κλείσιμο, ενεργοποιείται ο χειριστής close — αυτό είναι σημαντικό για επανασύνδεση σε περίπτωση διακοπής δικτύου.
Η κύρια διαφορά μεταξύ WebSocket και HTTP έγκειται στο μοντέλο αλληλεπίδρασης. Το HTTP λειτουργεί με το σχήμα αίτημα-απόκριση: ο πελάτης ξεκινά ένα αίτημα, ο διακομιστής επιστρέφει μια απάντηση, η σύνδεση κλείνει. Το WebSocket, αντίθετα, δημιουργεί ένα μόνιμο κανάλι μέσω του οποίου και τα δύο μέρη μπορούν να ξεκινήσουν μετάδοση ανά πάσα στιγμή.
Για εφαρμογές που απαιτούν χαμηλή καθυστέρηση και σταθερή ροή δεδομένων, το WebSocket είναι σημαντικά πιο αποδοτικό. Το HTTP Long Polling — εναλλακτική όπου ο διακομιστής διατηρεί το αίτημα ανοιχτό μέχρι να εμφανιστούν δεδομένα — δημιουργεί υπερβολικό φόρτο στον διακομιστή και αυξάνει την κατανάλωση μνήμης λόγω πολλαπλών ταυτόχρονων συνδέσεων.
| Παράμετρος | WebSocket | HTTP |
|---|---|---|
| Μοντέλο | Πλήρους αμφίδρομης | Αίτημα-απόκριση |
| Κεφαλίδα | 2–14 byte | 400–800 byte |
| Μόνιμη σύνδεση | Ναι, μία | Όχι, νέα ανά αίτημα |
| Καθυστέρηση | Χαμηλή (1–5 ms) | Υψηλή (50–200 ms) |
| Πρωτόκολλο | ws:// ή wss:// | http:// ή https:// |
Σύμφωνα με το High Performance Browser Networking (Grigorik, O’Reilly), το WebSocket μειώνει τις καθυστερήσεις δικτύου σε σενάρια πραγματικού χρόνου κατά 40–60% σε σύγκριση με το HTTP Long Polling και ο φόρτος του διακομιστή μειώνεται 3–5 φορές λόγω της εξάλειψης των επαναλαμβανόμενων χειραψιών.
Χάρη στη χαμηλή καθυστέρηση και την αμφίδρομη επικοινωνία, το WebSocket χρησιμοποιείται σε ένα ευρύ φάσμα εφαρμογών. Τα βασικά σενάρια περιλαμβάνουν άμεση ανταλλαγή μηνυμάτων, συγχρονισμό κατάστασης σε παιχνίδια και μετάδοση δεδομένων αγοράς σε χρηματοοικονομικά συστήματα.
Το WebSocket έχει γίνει το de facto πρότυπο για εφαρμογές συνομιλίας. Πλατφόρμες όπως το Slack, το Telegram Web και το WhatsApp Web χρησιμοποιούν WebSocket για άμεση παράδοση μηνυμάτων. Το πρωτόκολλο επιτρέπει την αποστολή τόσο μηνυμάτων κειμένου όσο και αρχείων μέσω ενός καναλιού και ο μηχανισμός ping/pong διατηρεί τη σύνδεση ενεργή ακόμη και χωρίς δραστηριότητα.
Τα πολυπαικτικά παιχνίδια περιήγησης και κινητών απαιτούν ελάχιστη καθυστέρηση για συγχρονισμό της κατάστασης των παικτών. Το WebSocket μεταδίδει συντεταγμένες, ενέργειες και γεγονότα σε πραγματικό χρόνο χωρίς τις καθυστερήσεις των αιτημάτων HTTP. Πλαίσια όπως το Socket.IO και το Colyseus αφαιρούν τη χαμηλού επιπέδου εργασία με το πρωτόκολλο, προσθέτοντας αυτόματη επανασύνδεση και δωμάτια.
Τα τερματικά χρηματιστηρίου και οι πλατφόρμες διαπραγμάτευσης χρησιμοποιούν WebSocket για τη λήψη τιμών σε πραγματικό χρόνο. Μια καθυστέρηση λίγων χιλιοστών του δευτερολέπτου μπορεί να κοστίσει εκατομμύρια δολάρια, γι’ αυτό τα χρηματοοικονομικά API — για παράδειγμα, Binance WebSocket Streams, Coinbase Pro — παρέχουν ακριβώς διεπαφές WebSocket για δεδομένα αγοράς.
Στην ανάπτυξη κινητών, το WebSocket χρησιμοποιείται μέσω εγγενών API: URLSessionWebSocketTask σε iOS και OkHttp WebSocket σε Android. Για το Flutter υπάρχει η βιβλιοθήκη web_socket_channel και για το React Native — react-native-websocket. Οι συσκευές IoT εφαρμόζουν WebSocket για μετάδοση τηλεμετρίας και λήψη εντολών ελέγχου, καθώς το πρωτόκολλο καταναλώνει λιγότερη ενέργεια από τη συνεχή HTTP-polling.
Ας εξετάσουμε ένα παράδειγμα του τμήματος διακομιστή σε Node.js με τη βιβλιοθήκη ws — την πιο δημοφιλή υλοποίηση WebSocket για JavaScript. Ο διακομιστής δέχεται συνδέσεις, επεξεργάζεται μηνύματα και τα μεταδίδει σε όλους τους συνδεδεμένους πελάτες.
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('Νέος πελάτης συνδέθηκε')
ws.on('message', (data) => {
console.log('Λήφθηκε:', data.toString())
ws.send('Ο διακομιστής έλαβε το μήνυμά σας')
})
ws.on('close', () => {
console.log('Ο πελάτης αποσυνδέθηκε')
})
})
console.log('Διακομιστής WebSocket ξεκίνησε στη θύρα 8080')
Ο διακομιστής δημιουργεί ένα στιγμιότυπο WebSocket.Server στη θύρα 8080 και περιμένει συνδέσεις. Σε κάθε νέο πελάτη εκχωρείται ένα ξεχωριστό αντικείμενο ws, μέσω του οποίου ο διακομιστής μπορεί να στέλνει μεμονωμένα μηνύματα. Η μετάδοση μηνυμάτων σε όλους τους πελάτες πραγματοποιείται μέσω μαζικής επανάληψης του πίνακα συνδέσεων. Με μεγάλο αριθμό πελατών (πάνω από 1000) συνιστάται η χρήση βιβλιοθηκών με υποστήριξη συσταδοποίησης, όπως το Socket.IO, που προσθέτουν κλιμάκωση μέσω Redis και αυτόματη επανασύνδεση.
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('Μήνυμα για όλους τους συμμετέχοντες')
}
})
Ο έλεγχος του readyState πριν από την αποστολή είναι υποχρεωτικός: εάν ο πελάτης έχει ήδη αποσυνδεθεί, η κλήση send θα προκαλέσει σφάλμα. Η σημαία WebSocket.OPEN εγγυάται ότι η σύνδεση είναι ενεργή και το μήνυμα θα παραδοθεί.
Για εφαρμογές iOS κινητών, το WebSocket υλοποιείται μέσω του URLSessionWebSocketTask, διαθέσιμο από το iOS 13. Η περίοδος λειτουργίας δημιουργεί μια εργασία με το URL του πρωτοκόλλου wss://, μετά την οποία καλούνται οι μέθοδοι send και receive. Η λήψη μηνυμάτων μπορεί να οργανωθεί μέσω συνεχούς αναδρομής receive, η οποία περιμένει το επόμενο μήνυμα μετά την επεξεργασία του προηγούμενου, εξασφαλίζοντας συνεχή λήψη δεδομένων χωρίς επανασύνδεση. Για Android χρησιμοποιείται το OkHttp WebSocket, το οποίο παρέχει παρόμοια διεπαφή με callbacks onOpen, onMessage, onClosing και onClosed, καθώς και αυτόματη επανασύνδεση σε περίπτωση διακοπής σύνδεσης.
Κατά την εργασία με WebSocket σε εφαρμογές κινητών, είναι σημαντικό να λαμβάνεται υπόψη η διαχείριση κύκλου ζωής: όταν η εφαρμογή μεταβαίνει στο παρασκήνιο, η σύνδεση μπορεί να διακοπεί από το σύστημα. Σε iOS, η σύνδεση πρέπει να αποκαθίσταται κατά την επιστροφή στο προσκήνιο μέσω του εκπροσώπου sceneDidBecomeActive. Σε Android, πρέπει να χρησιμοποιούνται στοιχεία με επίγνωση κύκλου ζωής (Lifecycle-aware) ή Service για τη διατήρηση της σύνδεσης. Επιπλέον, συνιστάται η εφαρμογή exponential backoff κατά την επανασύνδεση — αύξηση του διαστήματος μεταξύ προσπαθειών από 1 σε 30 δευτερόλεπτα, για να μην δημιουργείται υπερβολικός φόρτος στον διακομιστή σε προσωρινά προβλήματα δικτύου.
Συχνές ερωτήσεις
Το WebSocket δημιουργεί μια μόνιμη πλήρους αμφίδρομης σύνδεση μέσω της οποίας και τα δύο μέρη μπορούν να στέλνουν δεδομένα ανά πάσα στιγμή. Το HTTP λειτουργεί με το σχήμα αίτημα-απόκριση, όπου κάθε ανταλλαγή απαιτεί νέα σύνδεση και πλήρεις κεφαλίδες. Το WebSocket χρησιμοποιεί ένα κανάλι TCP και κεφαλίδες μόλις 2–14 byte, μειώνοντας δραστικά τις καθυστερήσεις.
Το WebSocket χρησιμοποιεί τη θύρα 80 για μη ασφαλείς συνδέσεις (ws://) και τη θύρα 443 για ασφαλείς συνδέσεις (wss://). Αυτό επιτρέπει τη διέλευση μέσω των περισσότερων διακομιστών μεσολάβησης και εταιρικών τειχών προστασίας χωρίς πρόσθετη ρύθμιση. Η θύρα 443 συνιστάται για περιβάλλοντα παραγωγής λόγω κρυπτογράφησης TLS.
Ναι, το WebSocket υποστηρίζεται σε όλες τις πλατφόρμες κινητών. Σε iOS, η εγγενής κλάση URLSessionWebSocketTask είναι διαθέσιμη από το iOS 13. Σε Android — η κλάση OkHttp WebSocket και η τυπική java.net.WebSocket. Για το React Native υπάρχει η βιβλιοθήκη react-native-websocket.
WebSocket Secure — η ασφαλής έκδοση του πρωτοκόλλου που λειτουργεί μέσω TLS. Όλα τα δεδομένα κρυπτογραφούνται όπως στο HTTPS. Το WSS είναι υποχρεωτικό για εφαρμογές παραγωγής, ειδικά κατά τη μετάδοση διακριτικών ελέγχου ταυτότητας ή προσωπικών δεδομένων μέσω WebSocket.
Οι κύριες εναλλακτικές: HTTP Long Polling (ο διακομιστής διατηρεί το αίτημα ανοιχτό), Server-Sent Events (μονόδρομη ροή από τον διακομιστή) και WebRTC Data Channel (επικοινωνία peer-to-peer). Τα Server-Sent Events είναι απλούστερα στην υλοποίηση, αλλά δεν υποστηρίζουν αποστολή από τον πελάτη στον διακομιστή.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης