WebSocket ir daudzu modernu tīmekļa lietojumprogrammu neatņemama tehnoloģija. Ja rakstāt kodu tīmeklim, jūs, iespējams, jau esat dzirdējis šo terminu, taču, iespējams, neesat pārliecināts, kas tas īsti ir vai kā to lietot. Par laimi WebSocket nav sarežģīts jēdziens, un jūs varat iegūt pamatzināšanas par to diezgan ātri.
Kas ir WebSocket?
Diemžēl WebSocket ir viens no tiem nosaukumiem, kam no pirmā acu uzmetiena nešķiet jēgas. WebSocket faktiski ir a nosaukums sakaru protokols kas nodrošina divvirzienu saziņu starp klientu un tīmekļa serveri.
Vienkāršāk sakot, WebSocket ir tehnoloģija, kas ļauj klientam un serverim izveidot savienojumu, kurā jebkura puse var nosūtīt otrai ziņojumu jebkurā laikā.
Tas atšķiras no parastā HTTP savienojuma, kur klientam ir jāierosina pieprasījums, un tikai tad serveris var nosūtīt atbildi. Faktiski WebSocket ir pilnīgi atšķirīgs saziņas protokols no HTTP, kas tika izstrādāts tā, lai tas būtu saderīgs ar HTTP. Ja klienta lietojumprogramma vēlas izveidot WebSocket savienojumu, tai ir jāizmanto HTTP jaunināšanas mehānisms lai pārslēgtos uz WebSocket protokolu.
Šajā brīdī jūs varētu domāt: "Protokols ir tikai noteikumu kopums, kā jūs varat to izmantot kodēšanai?".
Trūkstošais gabals ir kaut kas, ko sauc par a protokolu kaudze. Būtībā ierīcēs, kas atbalsta protokolu, ir iebūvēta aparatūra un programmatūra, kas ļauj rakstīt lietojumprogrammas, kas sazinās, izmantojot protokolu. Protokols netiek tieši izmantots, lai kaut ko izveidotu.
Kāpēc tika izveidots WebSocket?
Lai ilustrētu WebSocket nepieciešamību, apsveriet mehānismu, kas nodrošina tērzēšanu internetā.
Kāds no savas ierīces nosūta ziņojumu tērzēšanas serverim, taču serverim tas joprojām ir jānosūta uz jūsu ierīci, lai jūs varētu to lasīt. Ja serveris izmanto HTTP, serveris nevar tieši pārsūtīt šo ziņojumu jums, jo serveris nevar sākt pieprasījumus.
Ir daži veidi, kā novērst šo problēmu, izmantojot HTTP. Viens veids ir, ka klients pastāvīgi sūta atjaunināšanas pieprasījumus serverim, un serveris pārsūtīs visus datus, kas tam ir atbildē. Šo paņēmienu sauc par aptauju, un katru pieprasījumu sauc par aptauju. Ir divi aptaujas varianti: garā aptauja un īsā aptauja.
Garās aptaujas varianta izmantošana nozīmē, ka klienta ierīce pastāvīgi jautā serverim, vai ir pieejami jauni ziņojumi. Ja ir pieejami jauni ziņojumi, serveris nosūtīs ziņojumus kā atbildi. Ja nē, serveris aizkavētu atbildi un aizturētu savienojumu, līdz tam būs dati, ko nosūtīt atpakaļ, un tad klients nekavējoties veiktu jaunu pieprasījumu.
Šis paņēmiens ir neefektīvs, jo HTTP nebija paredzēts lietošanai šādā veidā. Tas darbojas pietiekami mazā mērogā, taču katrs HTTP pieprasījums ietver papildu datu nosūtīšanu galvenes, un tas rada ievērojami palielinātu slodzi uz serveri, kad daudzi klienti aptaujā to.
Šeit ir diagramma, kas ilustrē garu aptauju:
Īsās aptaujas variants ir vēl mazāk efektīvs. Īsā aptaujā serveris neuztur savienojumu atvērtu, kamēr nav saņemti jauni dati, kas nozīmē, ka klientam ir jāturpina aptaujāt serveri ar noteiktiem, ļoti īsiem intervāliem.
Vēl viens paņēmiens divvirzienu saziņai HTTP tiek saukts par straumēšanu.
Straumēšanas laikā pēc pirmā pieprasījuma nosūtīšanas serveris uztur savienojumu atvērtu uz nenoteiktu laiku, nosūtot jaunas informācijas daļas kā nepārtrauktas daļējas atbildes klientam.
Straumēšanas izmantošana rada mazāku datu un servera slodzi nekā aptauja, jo ideālā gadījumā klients veic tikai vienu HTTP pieprasījumu. Diemžēl straumēšana noteiktos apstākļos rada problēmas, jo pārlūkprogrammas un tīkla starpnieki (piemēram, starpniekserveri) bieži mēģina tikt galā ar daļējas atbildes kā vienas lielas HTTP atbildes fragmentus (kas ir normāla HTTP darbība), nevis kā atsevišķus ziņojumus, kuriem tie bija paredzēti būt.
WebSocket tika izveidots, lai atrisinātu šīs problēmas. Atšķirībā no HTTP, WebSocket tika īpaši izstrādāts divvirzienu saziņai. Izmantojot WebSocket, tiklīdz savienojums ir atvērts, klients un serveris var sūtīt ziņojumus uz priekšu un atpakaļ, neradot aptaujas vai straumēšanas problēmas.
Izmantojiet WebSocket futrāļus
WebSocket ir lieliska, taču tas nenozīmē, ka to vajadzētu izmantot visur.
WebSocket ieviešana var padarīt jūsu lietojumprogrammu sarežģītāku, jo īpaši servera pusē, tāpēc to nevajadzētu darīt, ja vien jums nav pamatota iemesla. Tas liek uzdot jautājumu: kā izskatās labs iemesls?
WebSocket ir ideāli piemērots izmantošanas gadījumiem, kad ir nepieciešama bieža divvirzienu saziņa ar zemu latentumu. Citiem vārdiem sakot, WebSocket nodrošina priekšrocības lietojumprogrammām, kurām ir jāsazinās bieži vai lielā mērogā. Ja saziņai nav jānotiek reāllaikā vai lietojumprogramma nekad neizaugs līdz liela mērogam, aptauju vai straumēšanu var izmantot šajā lietojumprogrammā.
Tipiski WebSocket lietojumi ir tērzēšanas lietojumprogrammu, tiešsaistes vairāku spēlētāju spēļu, reāllaika sadarbības un paziņojumu programmatūras izveide utt.
Kā izmantot WebSocket klienta pusē
WebSocket izmantošana servera pusē var būt diezgan saistīta, un process ievērojami atšķiras atkarībā no valodas (piemēram, C#, Javau.c.) un izvēles bibliotēku, tāpēc mēs to šeit neaplūkosim. Tālāk mēs īsi apspriedīsim, kā izmantot WebSocket klienta pusē.
Visas mūsdienu pārlūkprogrammas ievieš tīmekļa API, ko sauc par WebSocket API, kas ir WebSocket protokola pārlūkprogrammas protokolu steks. Varat izmantot WebSocket JavaScript, izmantojot šo API. API ļauj izveidot WebSocket objektu, caur kuru jūs izveidojat WebSocket savienojumu un mijiedarbojaties ar WebSocket serveri.
Lai izveidotu WebSocket objektu, varat izmantot šādu koda formātu:
let exampleSocket = new WebSocket("wss://www.example.com/socketserver", "manekena protokols");
Pirmais konstruktora arguments ir tā WebSocket servera URI, ar kuru vēlaties izveidot savienojumu. Tas vienmēr sāksies ar "ws" vai "wss". Otrais arguments nav obligāts. Tās vērtība ir vai nu virkne, vai virkņu masīvs, kas norāda jūsu atbalstītos apakšprotokolus.
WebSocket objektam ir tikai lasāms rekvizīts, ko sauc par readyState. Piekļuve šim īpašumam nodrošina pašreizējo WebSocket savienojuma stāvokli. readyState ir četras iespējamās vērtības: "connecting", "open", "closing" un "closed".
Kad šī koda rinda tiek palaista, pārlūkprogramma mēģinās izveidot savienojumu ar norādīto serveri. Savienojums netiks pabeigts uzreiz, tāpēc Socket piemēra readyState būs "savienojums". Ziņojumus nevar nosūtīt vai saņemt, kamēr savienojums nav pabeigts, un tad readyState vērtība kļūs "atvērta".
The piemērsSocket objektam ir notikumu uztvērējs (kas atšķiras no DOM notikumu klausītāji) sauc par "onopen", kas ļauj veikt turpmākās darbības tikai pēc savienojuma izveides. Objektam ir arī "sūtīšanas" metode, kas ļauj nosūtīt virknes, Blobs (bināros datus) un ArrayBuffers kā ziņojumus serverim.
Šeit ir piemērs, kā tos izmantot kopā:
exampleSocket.onopen = funkciju (notikumu) {
exampleSocket.send("WebSocket ir patiešām foršs");
};
API nodrošina arī veidu, kā jūs varat reaģēt uz servera sūtītajiem ziņojumiem. Tas tiek darīts ar notikumu klausītāju "onmessage". Šeit ir piemērs:
exampleSocket.onmessage = funkciju (notikumu) {
konsole.log(notikumu.dati);
}
Tā vietā jūs varat arī rakstīt bultiņas funkcija:
exampleSocket.onmessage = (notikums) => { konsole.log (event.data); }
API nodrošina arī a aizvērt () metode savienojuma pārtraukšanai. Lūk, kā tas izskatās:
piemērsSocket.aizvērt();
WebSocket nodrošina efektīvu divvirzienu saziņu
WebSocket ir divvirzienu sakaru protokols. Serveri un pārlūkprogrammas ievieš protokolu stekus, lai sazinātos, izmantojot WebSocket. WebSocket pastāv, jo HTTP nebija paredzēts divvirzienu. Ir metodes, kā ieviest divvirzienu savienojumus ar HTTP, taču tām ir problēmas.
WebSocket ir jaudīga tehnoloģija, taču tā nav nepieciešama visos gadījumos, jo tā var ievērojami sarežģīt lietojumprogrammu arhitektūru. WebSocket izmantošana klienta pusē tiek veikta, izmantojot pārlūkprogrammas WebSocket API.