Sobes.tech
Junior

Ce sunt socket-urile web?

sobes.tech AI

Răspuns de la AI

Websockets (Websockets) sunt un protocol de comunicare bidirecțională printr-o singură conexiune TCP, care permite schimbul de date în timp real între browser și server.

Diferențele cheie față de solicitările HTTP tradiționale:

  • Comunicare bidirecțională: Serverul poate trimite date către client fără o solicitare prealabilă din partea clientului.
  • O singură conexiune: Se stabilește o conexiune de lungă durată, eliminând costurile de stabilire a unei noi conexiuni pentru fiecare schimb de date (ca în HTTP).
  • Reducerea întârzierii: Se petrece mai puțin timp pentru stabilirea conexiunii, schimbul de anteturi și procesarea solicitărilor/răspunsurilor scurte.

Principiul de funcționare:

  1. Handshake: Browserul trimite o solicitare HTTP specială către server (cu anteturile Upgrade: websocket și Connection: Upgrade).
  2. Stabilirea conexiunii: Dacă serverul suportă websocket-uri, răspunde cu codul 101 Switching Protocols, după care conexiunea trece la protocolul websocket.
  3. Transmiterea datelor: După stabilirea conexiunii, ambele părți pot schimba mesaje liber în orice moment.

Exemple de utilizare:

  • Jocuri online
  • Chat-uri și mesagerie
  • Actualizări în timp real ale datelor (cotări, știri)
  • Instrumente colaborative

Avantaje:

  • Întârziere scăzută
  • Utilizare eficientă a resurselor (mai puțin overhead)
  • Comunicare bidirecțională în timp real

Dezavantaje:

  • Necesită suport atât pe partea clientului (browser), cât și pe partea serverului.
  • Implementare mai complexă comparativ cu solicitările HTTP simple.

Exemplu de cod client în JavaScript:

// crearea unui websocket
const socket = new WebSocket('wss://example.com/websocket');

// handler pentru deschiderea conexiunii
socket.onopen = function(event) {
  console.log('Conexiune stabilită');
  socket.send('Salut, server!'); // trimitere mesaj către server
};

// handler pentru primirea mesajelor
socket.onmessage = function(event) {
  console.log('Mesaj primit de la server: ' + event.data);
};

// handler pentru închiderea conexiunii
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Conexiune închisă în mod curat, cod=${event.code} motiv=${event.reason}`);
  } else {
    console.log('Conexiune întreruptă'); // de exemplu, din cauza unei erori de rețea
  }
};

// handler pentru eroare
socket.onerror = function(error) {
  console.error(`Eroare websocket: ${error}`);
};

// închiderea conexiunii (dacă este necesar)
// socket.close();