WebSocket on paljude kaasaegsete veebirakenduste lahutamatu tehnoloogia. Kui kirjutate veebi koodi, olete ilmselt seda terminit varem kuulnud, kuid võib-olla pole te kindel, mis see täpselt on või kuidas seda kasutada. Õnneks ei ole WebSocket keeruline mõiste ja saate sellest üsna kiiresti algteadmised.

Mis on WebSocket?

WebSocket on kahjuks üks neist nimedest, mis esmapilgul ei tundu olevat mõistlik. WebSocket on tegelikult a nimi sideprotokoll mis võimaldab kahesuunalist suhtlust kliendi ja veebiserveri vahel.

Lihtsamalt öeldes on WebSocket tehnoloogia, mis võimaldab kliendil ja serveril luua ühenduse, kus kumbki osapool saab igal ajal teisele sõnumi saata.

See erineb tavalisest HTTP-ühendusest, kus klient peab algatama päringu ja alles siis saab server saata vastuse. Tegelikult on WebSocket HTTP-st täiesti erinev sideprotokoll, mis oli loodud HTTP-ga ühilduvaks. Kui klientrakendus soovib luua WebSocket-ühenduse, peab see kasutama HTTP uuendamise mehhanism WebSocketi protokollile lülitumiseks.

Siinkohal võite mõelda: "Protokoll on lihtsalt reeglite kogum, kuidas saate seda kodeerimiseks kasutada?".

Puuduv tükk on midagi, mida nimetatakse a protokolli virn. Põhimõtteliselt on protokolli toetavatel seadmetel sisseehitatud riist- ja tarkvara, mis võimaldavad kirjutada protokolli kasutades suhtlevaid rakendusi. Protokolli ei kasutata otseselt millegi koostamiseks.

Miks WebSocket loodi?

WebSocketi vajaduse illustreerimiseks kaaluge Internetis vestluse taga olevat mehhanismi.

Keegi saadab oma seadmest sõnumi vestlusserverisse, kuid server peab selle sõnumi ikkagi teie seadmesse saatma, enne kui saate seda lugeda. Kui server kasutab HTTP-d, ei saa server seda sõnumit teile otse edastada, kuna server ei saa päringuid algatada.

Selle HTTP-probleemi lahendamiseks on paar võimalust. Üks võimalus on, et klient saadab serverile pidevalt uuendustaotlusi ja server edastab kõik vastuses olevad andmed. Seda tehnikat nimetatakse küsitluseks ja iga päringut nimetatakse küsitluseks. Küsitlust on kaks varianti: pikk küsitlus ja lühike küsitlus.

Pika küsitlusvariandi kasutamine tähendab, et klientseade küsib serverilt pidevalt, kas uusi sõnumeid on saadaval. Kui uued sõnumid on saadaval, saadab server sõnumid vastusena. Kui ei, siis server viivitab vastamisega ja hoiab ühendust avatud, kuni tal on andmeid, mida tagasi saata, ning seejärel esitab klient kohe uue päringu.

See tehnika on ebaefektiivne, kuna HTTP ei olnud sellisel viisil kasutamiseks mõeldud. See toimib väikeses mahus piisavalt, kuid iga HTTP-päring hõlmab täiendavate andmete saatmist päis ja see suurendab oluliselt serveri koormust, kui paljud kliendid küsitlevad seda.

Siin on diagramm, mis illustreerib pikka küsitlust:

Lühike küsitluse variant on veelgi vähem tõhus. Lühikesel küsitlusel ei hoia server ühendust avatuna enne, kui on uusi andmeid, mis tähendab, et klient peab serveris küsitlema kindlate ja väga lühikeste ajavahemike järel.

Teist HTTP kahesuunalise suhtluse tehnikat nimetatakse voogedastuseks.

Voogedastuse korral hoiab server pärast esimese päringu saatmist ühendust lõputult avatuna, saates kliendile pidevate osaliste vastustena uusi infokilde.

Voogesituse kasutamine toob kaasa väiksema andmemahu ja serveri koormuse kui küsitlemine, sest ideaalis teeb klient ainult ühe HTTP-päringu. Kahjuks tekitab voogesitus teatud tingimustel probleeme, kuna brauserid ja võrguvahendajad (nt puhverserverid) püüavad sageli osalisi vastuseid ühe suure HTTP-vastuse katkendlike tükkidena (mis on tavaline HTTP-käitumine), mitte eraldi sõnumitena, mille jaoks need olid mõeldud olla.

Nende probleemide lahendamiseks loodi WebSocket. Erinevalt HTTP-st oli WebSocket loodud spetsiaalselt kahesuunaliseks suhtluseks. WebSocketiga saavad pärast ühenduse avamist klient ja server saata sõnumeid edasi-tagasi ilma küsitluste või voogesituse probleemideta.

Kasutage WebSocketi ümbriseid

WebSocket on suurepärane, kuid see ei tähenda, et seda tuleks igal pool kasutada.

WebSocketi rakendamine võib teie rakendust keerukamaks muuta, eriti serveri poolel, seega ei tohiks seda teha, kui teil pole mõjuvat põhjust. See tekitab küsimuse: milline näeb välja hea põhjus?

WebSocket sobib ideaalselt kasutamiseks juhtudel, kus on vaja sagedast kahesuunalist suhtlust madala latentsusajaga. Teisisõnu pakub WebSocket eelise rakendustele, mis peavad suhtlema sageli või laialdaselt. Kui side ei pea olema reaalajas või kui rakendus ei kasva kunagi suuremahuliseks, võib selles rakenduses kasutamiseks piisata küsitlemisest või voogedastusest.

WebSocketi tüüpilised kasutusalad on vestlusrakenduste loomine, võrgus mitme mängijaga mängud, reaalajas koostöö ja teavitustarkvara jne.

Kuidas kasutada WebSocketit kliendi poolel

WebSocketi kasutamine serveri poolel võib olla üsna kaasatud ja protsess varieerub oluliselt sõltuvalt keelest (nt C#, Javajne) ja valitud raamatukogu, nii et me seda siin ei käsitle. Järgmisena käsitleme lühidalt, kuidas WebSocketit kliendi poolel kasutada.

Kõik kaasaegsed brauserid rakendavad veebi API-d nimega the WebSocket API, mis on WebSocketi protokolli brauseri protokollivirn. Selle API abil saate JavaScriptis kasutada WebSocketit. API võimaldab luua WebSocketi objekti, mille kaudu loote WebSocketi ühenduse ja suhtlete WebSocketi serveriga.

WebSocketi objekti loomiseks saate kasutada järgmist koodivormingut.

las exampleSocket = new WebSocket("wss://www.example.com/socketserver", "näivprotokoll");

Esimene argument konstruktorile on selle WebSocketi serveri URI, millega soovite ühenduse luua. See algab alati tähega "ws" või "wss". Teine argument on valikuline. Selle väärtus on kas string või stringide massiiv, mis määrab teie toetatavad alamprotokollid.

WebSocketi objektil on kirjutuskaitstud atribuut nimega readyState. Sellele atribuudile juurdepääs annab WebSocketi ühenduse hetkeseisu. readyState'il on neli võimalikku väärtust: "connecting", "open", "closing" ja "closed".

Kui see koodirida töötab, proovib brauser määratud serveriga ühendust luua. Ühendust ei saa korraga lõpule viia, nii et Socketi näite valmisolekus olek "ühendab". Sõnumeid ei saa saata ega vastu võtta enne, kui ühendus on lõppenud, siis muutub readyState väärtus "avatuks".

The näideSocket objektil on sündmuste kuulaja (mis erineb DOM-i sündmuste kuulajad) nimega "onopen", mis võimaldab teil teha edasisi toiminguid alles pärast ühenduse loomist. Objektil on ka "saatmise" meetod, mis võimaldab saata stringe, blobe (binaarandmeid) ja ArrayBuffreid sõnumitena serverisse.

Siin on näide nende koos kasutamisest:

näideSocket.onopen = funktsiooni (sündmus) {
exampleSocket.send("WebSocket on tõesti lahe");
};

API annab ka võimaluse reageerida serveri saadetud sõnumitele. Seda tehakse sündmuste kuulajaga "onmessage". Siin on näide:

exampleSocket.onmessage = funktsiooni (sündmus) {
konsool.log(sündmus.andmed);
}

Selle asemel võite ka kirjutada noolefunktsioon:

exampleSocket.onmessage = (sündmus) => { konsool.log (sündmus.andmed); }

API pakub ka a Sulge() meetod ühenduse sulgemiseks. See näeb välja järgmine:

näideSocket.Sulge();

WebSocket võimaldab tõhusat kahesuunalist suhtlust

WebSocket on kahesuunaline sideprotokoll. Serverid ja brauserid rakendavad WebSocketi kaudu suhtlemiseks protokollivirnu. WebSocket on olemas, kuna HTTP ei olnud loodud kahesuunaliseks. Kahesuunaliste ühenduste rakendamiseks HTTP-ga on meetodeid, kuid neil on probleeme.

WebSocket on võimas tehnoloogia, kuid pole kõigil juhtudel vajalik, kuna see võib rakenduste arhitektuuri oluliselt keerulisemaks muuta. WebSocketi kasutamine kliendi poolel toimub brauseri WebSocket API abil.