Sobes.tech
Junior

Τι είναι τα WebSockets;

sobes.tech AI

Απάντηση από AI

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

Βασικές διαφορές σε σχέση με τις παραδοσιακές αιτήσεις HTTP:

  • Διπλής κατεύθυνσης επικοινωνία: Ο διακομιστής μπορεί να στέλνει δεδομένα στον πελάτη χωρίς προηγούμενο αίτημα.
  • Μία σύνδεση: Δημιουργείται μια μακράς διάρκειας σύνδεση, εξαλείφοντας το κόστος δημιουργίας νέας σύνδεσης για κάθε ανταλλαγή δεδομένων (όπως στο HTTP).
  • Μείωση καθυστέρησης: Περισσότερος χρόνος αφιερώνεται στη δημιουργία σύνδεσης, την ανταλλαγή επικεφαλίδων και την επεξεργασία σύντομων αιτήσεων/απαντήσεων.

Αρχή λειτουργίας:

  1. Handshake: Ο περιηγητής στέλνει ένα ειδικό αίτημα HTTP στον διακομιστή (με επικεφαλίδες Upgrade: websocket και Connection: Upgrade).
  2. Εγκατάσταση σύνδεσης: Αν ο διακομιστής υποστηρίζει websockets, απαντά με τον κωδικό 101 Switching Protocols, μετά τον οποίο η σύνδεση μεταβαίνει στο πρωτόκολλο websocket.
  3. Μετάδοση δεδομένων: Μετά την εγκατάσταση της σύνδεσης, και τα δύο μέρη μπορούν ελεύθερα να ανταλλάσσουν μηνύματα οποιαδήποτε στιγμή.

Παραδείγματα χρήσης:

  • Online παιχνίδια
  • Chat και μηνυματα
  • Ενημερώσεις δεδομένων σε πραγματικό χρόνο (τιμές, ειδήσεις)
  • Εργαλεία συνεργασίας

Πλεονεκτήματα:

  • Χαμηλή καθυστέρηση
  • Αποτελεσματική χρήση πόρων (λιγότερο overhead)
  • Διπλής κατεύθυνσης επικοινωνία σε πραγματικό χρόνο

Μειονεκτήματα:

  • Απαιτεί υποστήριξη τόσο στην πλευρά του πελάτη (περιηγητής), όσο και στην πλευρά του διακομιστή.
  • Πιο πολύπλοκη υλοποίηση σε σύγκριση με απλά αιτήματα HTTP.

Παράδειγμα κώδικα πελάτη σε JavaScript:

// δημιουργία websocket
const socket = new WebSocket('wss://example.com/websocket');

// χειριστής ανοίγματος σύνδεσης
socket.onopen = function(event) {
  console.log('Η σύνδεση έχει εγκατασταθεί');
  socket.send('Γειά σου, διακομιστή!'); // αποστολή μηνύματος στον διακομιστή
};

// χειριστής λήψης μηνύματος
socket.onmessage = function(event) {
  console.log('Λήφθηκε μήνυμα από τον διακομιστή: ' + event.data);
};

// χειριστής κλεισίματος σύνδεσης
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Η σύνδεση έκλεισε καθαρά, κωδικός=${event.code} λόγος=${event.reason}`);
  } else {
    console.log('Η σύνδεση διακόπηκε'); // π.χ., λόγω σφάλματος δικτύου
  }
};

// χειριστής σφαλμάτων
socket.onerror = function(error) {
  console.error(`Σφάλμα websocket: ${error}`);
};

// κλείσιμο σύνδεσης (αν χρειάζεται)
// socket.close();