Sobes.tech
Junior

Kas yra žiniatinklio soketai?

sobes.tech AI

Atsakymas iš AI

Websockets (Websockets) yra dvipusės ryšio protokolas per vieną TCP jungtį, leidžiantis keistis duomenimis tarp naršyklės ir serverio realiu laiku.

Pagrindiniai skirtumai nuo tradicinių HTTP užklausų:

  • Dvipusis ryšys: Serveris gali siųsti duomenis klientui be išankstinio užklausos iš kliento.
  • Viena jungtis: Sukuriama viena ilgalaikė jungtis, kuri pašalina naujos jungties kūrimo išlaidas kiekvienai duomenų mainų operacijai (kaip HTTP atveju).
  • Vėlavimo sumažinimas: Mažiau laiko skiriama jungties kūrimui, antraščių mainams ir trumpų užklausų/atsakymų apdorojimui.

Veikimo principas:

  1. Handshake: Naršyklė siunčia specialų HTTP užklausą serveriui (Upgrade: websocket ir Connection: Upgrade antraštes).
  2. Jungties sukūrimas: Jei serveris palaiko websockets, jis atsako su kodu 101 Switching Protocols, po kurio jungtis pereina į websocket protokolą.
  3. Duomenų perdavimas: Po jungties sukūrimo abi pusės gali laisvai keistis žinutėmis bet kuriuo metu.

Naudojimo pavyzdžiai:

  • Internetiniai žaidimai
  • Pokalbiai ir žinučių siuntėjai
  • Realiu laiku duomenų atnaujinimai (kursai, naujienos)
  • Kolaboraciniai įrankiai

Privalumai:

  • Mažas vėlavimas
  • Efektyvus išteklių naudojimas (mažiau papildomų išlaidų)
  • Dvipusis ryšys realiu laiku

Trūkumai:

  • Reikalauja palaikymo tiek kliento (naršyklės), tiek serverio pusėje.
  • Sudėtingesnė įgyvendinimas nei paprastos HTTP užklausos.

JavaScript pavyzdinis klientinis kodas:

// WebSocket sukūrimas
const socket = new WebSocket('wss://example.com/websocket');

// atidarymo įvykio tvarkytojas
socket.onopen = function(event) {
  console.log('Jungtis sukurta');
  socket.send('Sveiki, serveri!'); // žinutės siuntimas serveriui
};

// žinutės gavimo įvykio tvarkytojas
socket.onmessage = function(event) {
  console.log('Gauta žinutė iš serverio: ' + event.data);
};

// jungties uždarymo įvykio tvarkytojas
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Jungtis uždaryta švariai, kodas=${event.code} priežastis=${event.reason}`);
  } else {
    console.log('Jungtis nutraukta'); // pvz., dėl tinklo klaidos
  }
};

// klaidos tvarkytojas
socket.onerror = function(error) {
  console.error(`WebSocket klaida: ${error}`);
};

// jungties uždarymas (jei reikia)
// socket.close();