WebSocket je sestavni del tehnologije v številnih sodobnih spletnih aplikacijah. Če pišete kodo za splet, ste ta izraz verjetno že slišali, vendar morda niste prepričani, kaj točno je in kako ga uporabiti. Na srečo WebSocket ni zapleten koncept in ga lahko precej hitro razumete.
Kaj je WebSocket?
WebSocket je na žalost eno tistih imen, ki se na prvi pogled ne zdijo smiselna. WebSocket je pravzaprav ime a komunikacijski protokol ki omogoča dvosmerno komunikacijo med odjemalcem in spletnim strežnikom.
Preprosteje povedano, WebSocket je tehnologija, ki odjemalcu in strežniku omogoča, da ustvarita povezavo, pri kateri lahko vsaka stran drugi drugi kadar koli pošlje sporočilo.
To se razlikuje od običajne povezave HTTP, kjer mora odjemalec sprožiti zahtevo in šele nato lahko strežnik pošlje odgovor. Pravzaprav je WebSocket popolnoma drugačen komunikacijski protokol od HTTP, ki je bil zasnovan tako, da je združljiv s HTTP. Ko odjemalska aplikacija želi začeti povezavo WebSocket, mora uporabiti Mehanizem nadgradnje HTTP za preklop na protokol WebSocket.
Na tej točki boste morda pomislili: "protokol je le niz pravil, kako lahko to uporabite za kodiranje?".
Manjkajoči del je nekaj, kar se imenuje a protokolni sklad. V bistvu imajo naprave, ki podpirajo protokol, vgrajeno strojno in programsko opremo, ki omogočata pisanje aplikacij, ki komunicirajo z uporabo protokola. Protokol se ne uporablja neposredno za gradnjo ničesar.
Zakaj je bil ustvarjen WebSocket?
Za ponazoritev potrebe po WebSocketu razmislite o mehanizmu za klepetanje v internetu.
Nekdo pošlje sporočilo v strežnik za klepet iz svoje naprave, vendar mora strežnik še vedno poslati to sporočilo v vašo napravo, preden ga lahko preberete. Če strežnik uporablja HTTP, vam strežnik ne more neposredno posredovati tega sporočila, ker strežnik ne more sprožiti zahtev.
To težavo s HTTP lahko odpravite na nekaj načinov. Eden od načinov je, da odjemalec nenehno pošilja zahteve za posodobitev strežniku, strežnik pa bo posredoval vse podatke, ki jih ima v odgovoru. Ta tehnika se imenuje glasovanje in vsaka zahteva se imenuje anketa. Obstajata dve različici anketiranja: dolgo anketiranje in kratko anketiranje.
Uporaba različice dolgega pozivanja pomeni, da odjemalska naprava nenehno sprašuje strežnik, ali so na voljo kakšna nova sporočila. Če so na voljo nova sporočila, jih strežnik pošlje kot odgovor. Če ne, bi strežnik odložil odziv in zadržal odprto povezavo, dokler ne bi imel podatkov za pošiljanje nazaj, nato pa bi odjemalec takoj poslal novo zahtevo.
Ta tehnika je neučinkovita, ker HTTP ni bil zasnovan za takšno uporabo. Deluje ustrezno v majhnem obsegu, vendar vsaka zahteva HTTP vključuje pošiljanje dodatnih podatkov v glavo, kar ima za posledico znatno povečano obremenitev strežnika, ko kliče veliko odjemalcev to.
Tukaj je diagram, ki prikazuje dolgo glasovanje:
Varianta kratkega glasovanja je še manj učinkovita. Pri kratkem pozivanju strežnik ne zadrži odprte povezave, dokler ni novih podatkov, kar pomeni, da mora odjemalec še naprej preverjati strežnik v določenih, zelo kratkih intervalih.
Druga tehnika dvosmerne komunikacije v HTTP se imenuje pretakanje.
Pri pretakanju po prvi poslani zahtevi strežnik zadrži povezavo odprto za nedoločen čas in odjemalcu pošilja nove informacije kot neprekinjene delne odgovore.
Uporaba pretakanja povzroči manjše stroške podatkov in obremenitev strežnika kot anketiranje, ker v idealnem primeru odjemalec naredi samo eno zahtevo HTTP. Na žalost pretakanje povzroča težave pod določenimi pogoji, ker brskalniki in omrežni posredniki (kot so posredniki) pogosto poskušajo obravnavati delni odgovori kot zdrobljeni deli enega velikega odziva HTTP (kar je običajno vedenje HTTP), namesto kot ločena sporočila, ki so jim bila namenjena biti.
WebSocket je bil ustvarjen za rešitev teh težav. Za razliko od HTTP je bil WebSocket zasnovan posebej za dvosmerno komunikacijo. Z WebSocket, ko se povezava odpre, lahko odjemalec in strežnik pošiljata sporočila naprej in nazaj brez težav pri anketiranju ali pretakanju.
Primeri uporabe za WebSocket
WebSocket je odličen, vendar to ne pomeni, da bi ga morali uporabljati povsod.
Implementacija WebSocket lahko dodatno zaplete vašo aplikacijo, zlasti na strani strežnika, zato je ne bi smeli izvajati, razen če imate dober razlog. To postavlja vprašanje: kako izgleda dober razlog?
WebSocket je idealen za primere uporabe, kjer je potrebna pogosta dvosmerna komunikacija z nizko zakasnitvijo. Z drugimi besedami, WebSocket zagotavlja prednost aplikacijam, ki morajo komunicirati pogosto ali v velikem obsegu. Če ni treba, da je komunikacija v realnem času ali da aplikacija nikoli ne bo zrasla do velikega obsega, lahko anketiranje ali pretakanje zadostujeta za uporabo v tej aplikaciji.
Običajna uporaba WebSocketa je izdelava aplikacij za klepet, spletnih iger za več igralcev, programska oprema za sodelovanje in obveščanje v realnem času itd.
Kako uporabljati WebSocket na strani odjemalca
Uporaba WebSocketa na strani strežnika je lahko precej zapletena, postopek pa se močno razlikuje glede na jezik (npr. C#, Java, itd.) in knjižnico po izbiri, zato tega tukaj ne bomo obravnavali. Nato bomo na kratko razpravljali o tem, kako uporabljati WebSocket na strani odjemalca.
Vsi sodobni brskalniki izvajajo spletni API, imenovan WebSocket API, ki je sklad protokola brskalnika za protokol WebSocket. S tem API-jem lahko uporabite WebSocket v JavaScriptu. API vam omogoča ustvarjanje predmeta WebSocket, prek katerega ustvarite povezavo WebSocket in komunicirate s strežnikom WebSocket.
Za ustvarjanje predmeta WebSocket lahko uporabite naslednjo obliko kode:
let exampleSocket = new WebSocket("wss://www.example.com/socketserver", "dummyProtocol");
Prvi argument konstruktorju je URI strežnika WebSocket, s katerim želite ustvariti povezavo. Vedno se bo začel z "ws" ali "wss". Drugi argument ni obvezen. Njegova vrednost je bodisi niz ali polje nizov, ki določa podprotokole, ki jih podpirate.
Objekt WebSocket ima lastnost samo za branje, imenovano readyState. Dostop do te lastnosti zagotavlja trenutno stanje povezave WebSocket. readyState ima štiri možne vrednosti: "connecting", "open", "closing" in "closed".
Ko se ta vrstica kode zažene, se bo brskalnik poskušal povezati z navedenim strežnikom. Povezava ne bo vzpostavljena naenkrat, zato bo pripravljeno stanje exampleSocket "povezovanje". Nobenega sporočila ni mogoče poslati ali prejeti, dokler povezava ni končana, takrat bo vrednost readyState postala "odprta".
The exampleSocket objekt ima poslušalca dogodkov (ki se razlikuje od poslušalci dogodkov DOM), imenovano "onopen", ki vam omogoča izvajanje nadaljnjih dejanj šele po vzpostavitvi povezave. Objekt ima tudi metodo »pošlji«, ki vam omogoča pošiljanje nizov, Blobov (binarni podatki) in ArrayBufferjev kot sporočil strežniku.
Tukaj je primer uporabe teh skupaj:
exampleSocket.onopen = funkcijo (dogodek) {
exampleSocket.send("WebSocket je res kul");
};
API ponuja tudi način, da se lahko odzovete na sporočila, ki jih pošilja strežnik. To se naredi s poslušalcem dogodkov "onmessage". Tukaj je primer:
exampleSocket.onmessage = funkcijo (dogodek) {
konzola.log(dogodek.podatki);
}
Namesto tega lahko tudi pišete funkcijo puščice:
exampleSocket.onmessage = (dogodek) => { konzola.log (event.data); }
API nudi tudi a zapri() način za prekinitev povezave. Takole izgleda:
exampleSocket.zapri();
WebSocket omogoča učinkovito dvosmerno komunikacijo
WebSocket je dvosmerni komunikacijski protokol. Strežniki in brskalniki izvajajo sklade protokolov za komunikacijo z uporabo WebSocket. WebSocket obstaja, ker HTTP ni bil zasnovan kot dvosmerni. Obstajajo metode za implementacijo dvosmernih povezav s HTTP, vendar imajo težave.
WebSocket je zmogljiva tehnologija, vendar ni potrebna v vseh primerih, saj lahko znatno zaplete arhitekturo aplikacije. Uporaba WebSocket na strani odjemalca poteka z API-jem WebSocket brskalnika.