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:
- Handshake: Naršyklė siunčia specialų HTTP užklausą serveriui (
Upgrade: websocketirConnection: Upgradeantraštes). - Jungties sukūrimas: Jei serveris palaiko websockets, jis atsako su kodu
101 Switching Protocols, po kurio jungtis pereina į websocket protokolą. - 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();