„WebSocket“ yra neatsiejama daugelio šiuolaikinių žiniatinklio programų technologija. Jei rašote žiniatinklio kodą, tikriausiai jau girdėjote šį terminą, bet galbūt nesate tikri, kas tai yra arba kaip jį naudoti. Laimei, „WebSocket“ nėra sudėtinga sąvoka, ir jūs galite gana greitai gauti pagrindinį jos supratimą.

Kas yra WebSocket?

WebSocket, deja, yra vienas iš tų pavadinimų, kurie iš pirmo žvilgsnio neatrodo prasmingi. „WebSocket“ iš tikrųjų yra a pavadinimas ryšio protokolas kuri leidžia palaikyti dvikryptį ryšį tarp kliento ir žiniatinklio serverio.

Paprasčiau tariant, „WebSocket“ yra technologija, leidžianti klientui ir serveriui sukurti ryšį, kai bet kuri šalis gali bet kada išsiųsti kitai pranešimą.

Tai skiriasi nuo įprasto HTTP ryšio, kai klientas turi inicijuoti užklausą ir tik tada serveris gali siųsti atsakymą. Tiesą sakant, „WebSocket“ yra visiškai kitoks ryšio protokolas nei HTTP, kuris buvo sukurtas taip, kad būtų suderinamas su HTTP. Kai kliento programa nori inicijuoti „WebSocket“ ryšį, ji turi naudoti

instagram viewer
HTTP atnaujinimo mechanizmas Norėdami pereiti prie WebSocket protokolo.

Šiuo metu galite galvoti: "Protokolas yra tik taisyklių rinkinys, kaip galite jį naudoti koduodami?".

Trūkstama dalis yra kažkas, vadinama a protokolų krūva. Iš esmės įrenginiuose, palaikančiuose protokolą, yra integruota aparatinė ir programinė įranga, leidžianti rašyti programas, kurios palaiko ryšį naudojant protokolą. Protokolas nėra tiesiogiai naudojamas nieko kurti.

Kodėl buvo sukurtas „WebSocket“?

Norėdami parodyti WebSocket poreikį, apsvarstykite pokalbių internete mechanizmą.

Kažkas siunčia pranešimą į pokalbių serverį iš savo įrenginio, bet serveris vis tiek turi išsiųsti pranešimą į jūsų įrenginį, kad galėtumėte jį perskaityti. Jei serveris naudoja HTTP, serveris negali tiesiogiai persiųsti šio pranešimo jums, nes serveris negali inicijuoti užklausų.

Yra keli būdai, kaip išspręsti šią problemą naudojant HTTP. Vienas iš būdų – klientas nuolat siųsti serveriui atnaujinimo užklausas, o serveris perduos visus duomenis, kuriuos turi atsakyme. Ši technika vadinama apklausa, o kiekviena užklausa vadinama apklausa. Yra du apklausos variantai: ilga apklausa ir trumpoji apklausa.

Ilgo apklausos varianto naudojimas reiškia, kad kliento įrenginys nuolat klausia serverio, ar yra kokių nors naujų pranešimų. Jei yra naujų pranešimų, serveris išsiųs juos kaip atsakymą. Jei ne, serveris atidėtų atsakymą ir laikytų atidarytą ryšį, kol turės duomenų, kuriuos reikia siųsti, o tada klientas nedelsdamas pateiktų naują užklausą.

Ši technika neefektyvi, nes HTTP nebuvo sukurtas taip naudoti. Jis tinkamai veikia nedideliu mastu, tačiau kiekviena HTTP užklausa apima papildomų duomenų siuntimą antraštę ir dėl to žymiai padidėja serverio apkrova, kai apklausia daug klientų tai.

Štai diagrama, iliustruojanti ilgą apklausą:

Trumpas apklausos variantas yra dar mažiau efektyvus. Trumpai apklausiant, serveris nelaiko ryšio atidaryto tol, kol nėra naujų duomenų, o tai reiškia, kad klientas turi nuolat apklausti serverį fiksuotais labai trumpais intervalais.

Kita dvikrypčio ryšio HTTP technologija vadinama srautiniu perdavimu.

Srautinio perdavimo metu po pirmosios užklausos išsiuntimo serveris palaiko ryšį neribotą laiką, siųsdamas naujas informacijos dalis kaip nuolatinius dalinius atsakymus klientui.

Naudojant srautinį perdavimą, duomenų srautas ir serverio apkrova yra mažesnė nei apklausa, nes idealiu atveju klientas pateikia tik vieną HTTP užklausą. Deja, srautinis perdavimas tam tikromis sąlygomis sukelia problemų, nes naršyklės ir tinklo tarpininkai (pvz., tarpiniai serveriai) dažnai bando tvarkyti daliniai atsakymai kaip vieno didelio HTTP atsako suskaidytos dalys (tai yra įprastas HTTP elgesys), o ne kaip atskiri pranešimai, kuriems jie buvo skirti būti.

„WebSocket“ buvo sukurtas šioms problemoms išspręsti. Skirtingai nuo HTTP, „WebSocket“ buvo sukurtas specialiai dvikrypčiai komunikacijai. Naudojant „WebSocket“, atidarius ryšį, klientas ir serveris gali siųsti pranešimus pirmyn ir atgal be apklausų ar srautinio perdavimo problemų.

Naudokite „WebSocket“ dėklus

„WebSocket“ yra puikus, tačiau tai nereiškia, kad jis turėtų būti naudojamas visur.

„WebSocket“ diegimas gali padaryti jūsų taikomąją programą sudėtingesnę, ypač serverio pusėje, todėl tai neturėtų būti daroma, nebent turite rimtą priežastį. Tai kelia klausimą: kaip atrodo gera priežastis?

„WebSocket“ idealiai tinka naudoti tais atvejais, kai reikalingas dažnas dvikryptis ryšys su maža delsa. Kitaip tariant, „WebSocket“ suteikia pranašumą programoms, kurioms reikia dažnai arba dideliu mastu bendrauti. Jei ryšys nebūtinai turi vykti realiuoju laiku arba programa niekada neišaugs iki didelio masto, toje programoje gali pakakti apklausos arba srautinio perdavimo.

Paprastai „WebSocket“ naudojamas kuriant pokalbių programas, internetinius kelių žaidėjų žaidimus, realiojo laiko bendradarbiavimo ir pranešimų programinę įrangą ir kt.

Kaip naudoti „WebSocket“ kliento pusėje

„WebSocket“ naudojimas serverio pusėje gali būti gana sudėtingas, o procesas labai skiriasi priklausomai nuo kalbos (pvz., C#, Javair tt) ir pasirinkta biblioteka, todėl čia jos nenagrinėsime. Toliau trumpai aptarsime, kaip naudoti „WebSocket“ kliento pusėje.

Visos šiuolaikinės naršyklės įdiegia žiniatinklio API, vadinamą WebSocket API, kuri yra naršyklės protokolų rinkinys, skirtas WebSocket protokolui. „WebSocket“ galite naudoti „JavaScript“ naudodami šią API. API leidžia sukurti WebSocket objektą, per kurį sukuriate WebSocket ryšį ir sąveikaujate su WebSocket serveriu.

Norėdami sukurti „WebSocket“ objektą, galite naudoti šį kodo formatą:

tegu exampleSocket = new WebSocket("wss://www.example.com/socketserver", "manekeno protokolas");

Pirmasis konstruktoriaus argumentas yra WebSocket serverio, su kuriuo norite sukurti ryšį, URI. Jis visada prasidės „ws“ arba „wss“. Antrasis argumentas yra neprivalomas. Jo reikšmė yra eilutė arba eilučių masyvas, nurodantis jūsų palaikomus antrinius protokolus.

WebSocket objektas turi tik skaitymo ypatybę, vadinamą readyState. Pasiekus šią nuosavybę pateikiama dabartinė „WebSocket“ ryšio būsena. ReadyState turi keturias galimas reikšmes: "connecting", "open", "closing" ir "closed".

Kai ši kodo eilutė bus paleista, naršyklė bandys prisijungti prie nurodyto serverio. Ryšys nebus baigtas iš karto, todėl pavyzdžio „Socket“ paruošta būsena bus „jungiasi“. Jokių pranešimų negalima siųsti ar gauti, kol nebus baigtas ryšys, tada readyState reikšmė taps "atvira".

The pavyzdysSocket objektas turi įvykių klausytoją (kuris skiriasi nuo DOM įvykių klausytojai) vadinamas „onopen“, leidžiančiu atlikti tolesnius veiksmus tik užmezgus ryšį. Objektas taip pat turi "siųsti" metodą, leidžiantį siųsti eilutes, BLOB (dvejetainius duomenis) ir ArrayBuffers kaip pranešimus serveriui.

Štai pavyzdys, kaip juos naudoti kartu:

pavyzdysSocket.onopen = funkcija (įvykis) {
exampleSocket.send("„WebSocket“ yra tikrai šaunus");
};

API taip pat suteikia galimybę reaguoti į serverio siunčiamus pranešimus. Tai atliekama naudojant „onmessage“ įvykių klausytoją. Štai pavyzdys:

exampleSocket.onmessage = funkcija (įvykis) {
konsolė.log(įvykis.duomenys);
}

Vietoj to, jūs taip pat galite rašyti rodyklės funkcija:

exampleSocket.onmessage = (įvykis) => { konsolė.log (įvykis.duomenys); }

API taip pat suteikia a Uždaryti() būdas uždaryti ryšį. Štai kaip tai atrodo:

pavyzdysSocket.Uždaryti();

WebSocket įgalina efektyvų dvikryptį ryšį

„WebSocket“ yra dvikrypčio ryšio protokolas. Serveriai ir naršyklės įdiegia protokolų krūvas, kad galėtų bendrauti naudodami „WebSocket“. WebSocket egzistuoja, nes HTTP nebuvo sukurtas taip, kad būtų dvikryptis. Yra būdų, kaip įdiegti dvikrypčius ryšius naudojant HTTP, tačiau jie turi problemų.

„WebSocket“ yra galinga technologija, tačiau ji nebūtina visais atvejais, nes gali labai apsunkinti programos architektūrą. „WebSocket“ naudojimas kliento pusėje atliekamas naudojant naršyklės „WebSocket“ API.