ВебСоцкет је интегрална технологија у многим модерним веб апликацијама. Ако пишете код за веб, вероватно сте већ чули за тај термин, али можда нисте сигурни шта је то тачно или како да га користите. На срећу, ВебСоцкет није сложен концепт и можете га прилично брзо стећи основно разумевање.
Шта је ВебСоцкет?
ВебСоцкет је, нажалост, једно од оних имена за које се на први поглед чини да нема смисла. ВебСоцкет је заправо име а комуникациони протокол који омогућава двосмерну комуникацију између клијента и веб сервера.
Једноставније речено, ВебСоцкет је технологија која омогућава клијенту и серверу да створе везу у којој било која страна може послати поруку другој у било ком тренутку.
Ово се разликује од обичне ХТТП везе, где клијент мора да покрене захтев, а тек онда сервер може да пошаље одговор. У ствари, ВебСоцкет је потпуно другачији комуникациони протокол од ХТТП-а који је дизајниран да буде ХТТП компатибилан. Када клијентска апликација жели да покрене ВебСоцкет везу, мора да користи Механизам ХТТП надоградње да бисте прешли на ВебСоцкет протокол.
У овом тренутку, можда мислите: "протокол је само скуп правила, како то можете користити за кодирање?".
Комад који недостаје је нешто што се зове а стек протокола. У суштини, уређаји који подржавају протокол имају уграђен хардвер и софтвер који вам омогућавају да пишете апликације које комуницирају помоћу протокола. Протокол се не користи директно за било шта.
Зашто је креиран ВебСоцкет?
Да бисте илустровали потребу за ВебСоцкет-ом, размотрите механизам који стоји иза ћаскања на интернету.
Неко шаље поруку серверу за ћаскање са свог уређаја, али сервер и даље мора да пошаље ту поруку на ваш уређај пре него што можете да је прочитате. Ако сервер користи ХТТП, сервер не може директно да вам проследи ту поруку, јер сервер не може да покрене захтеве.
Постоји неколико начина да решите овај проблем са ХТТП-ом. Један од начина је да клијент стално шаље захтеве за ажурирање серверу, а сервер ће проследити све податке које има у одговору. Ова техника се зове анкетирање, а сваки захтев се зове анкета. Постоје две варијанте гласања: дуго и кратко гласање.
Коришћење варијанте дугог позивања значи да клијентски уређај стално пита сервер да ли су доступне нове поруке. Ако су нове поруке доступне, сервер ће послати поруке као одговор. У супротном, сервер би одложио одговор и држао отворену везу док не буде имао податке за враћање, а затим би клијент одмах упутио нови захтев.
Ова техника је неефикасна, јер ХТТП није дизајниран да се користи на овај начин. Ради адекватно у малом обиму, али сваки ХТТП захтев укључује слање додатних података у заглавље, а то резултира значајно повећаним оптерећењем на серверу када многи клијенти анкетирају то.
Ево дијаграма који илуструје дуго гласање:
Кратка варијанта анкетирања је још мање ефикасна. У кратком прозивању, сервер не држи везу отвореном све док не дође до нових података, што значи да клијент мора да настави да прозива сервер у фиксним, врло кратким интервалима.
Друга техника за двосмерну комуникацију у ХТТП-у се зове стримовање.
У стримингу, након слања првог захтева, сервер држи везу отвореном на неодређено време, шаљући нове делове информација као континуиране делимичне одговоре клијенту.
Коришћење стримовања резултира мањим оптерећењем података и оптерећењем сервера од анкетирања, јер у идеалном случају клијент поставља само један ХТТП захтев. Нажалост, стримовање ствара проблеме под одређеним условима јер прегледачи и мрежни посредници (попут проксија) често покушавају да обрађују делимични одговори као поломљени делови једног великог ХТТП одговора (што је нормално ХТТП понашање), уместо као засебне поруке које су биле намењене бити.
ВебСоцкет је креиран да реши ове проблеме. За разлику од ХТТП-а, ВебСоцкет је дизајниран посебно за двосмерну комуникацију. Са ВебСоцкет-ом, када се веза отвори, клијент и сервер могу да шаљу поруке напред и назад без проблема са анкетирањем или стримингом.
Случајеви употребе за ВебСоцкет
ВебСоцкет је одличан, али то не значи да га треба користити свуда.
Примена ВебСоцкет-а може додати сложеност вашој апликацији, посебно на страни сервера, тако да то не би требало да се ради осим ако немате добар разлог. Поставља се питање: како изгледа добар разлог?
ВебСоцкет је идеалан за случајеве употребе где је потребна честа двосмерна комуникација са малим кашњењем. Другим речима, ВебСоцкет пружа предност апликацијама које морају да комуницирају често или у великом обиму. Ако комуникација не мора да буде у реалном времену или апликација никада неће прерасти у велике размере, анкетирање или стримовање би могли бити довољни за коришћење у тој апликацији.
Типична употреба ВебСоцкет-а је у изградњи апликација за ћаскање, онлајн игара за више играча, софтвера за сарадњу и обавештења у реалном времену итд.
Како користити ВебСоцкет на страни клијента
Коришћење ВебСоцкет-а на страни сервера може бити прилично компликовано, а процес се значајно разликује у зависности од језика (нпр. Ц#, Јаваитд.) и библиотеку по избору, тако да то овде нећемо покривати. Затим ћемо укратко разговарати о томе како да користимо ВебСоцкет на страни клијента.
Сви модерни претраживачи имплементирају веб АПИ под називом ВебСоцкет АПИ, што је стек протокола претраживача за ВебСоцкет протокол. Можете користити ВебСоцкет у ЈаваСцрипт-у користећи овај АПИ. АПИ вам омогућава да креирате ВебСоцкет објекат, преко којег креирате ВебСоцкет везу и комуницирате са ВебСоцкет сервером.
Можете користити следећи формат кода да бисте креирали ВебСоцкет објекат:
нека екамплеСоцкет = нови ВебСоцкет("всс://ввв.екампле.цом/соцкетсервер", "думмиПротоцол");
Први аргумент конструктора је УРИ ВебСоцкет сервера са којим желите да направите везу. Увек ће почети са "вс" или "всс". Други аргумент је опциони. Његова вредност је или стринг или низ стрингова, који специфицирају потпротоколе које подржавате.
ВебСоцкет објекат има својство само за читање под називом реадиСтате. Приступ овом својству обезбеђује тренутно стање ВебСоцкет везе. реадиСтате има четири могуће вредности: "цоннецтинг", "опен", "цлосинг" и "цлосед".
Када се та линија кода покрене, претраживач ће покушати да се повеже са наведеним сервером. Веза неће бити завршена одједном, тако да ће стање спремности екамплеСоцкет-а бити "повезивање". Поруке се не могу слати или примати док се веза не заврши, у ком тренутку ће вредност реадиСтате постати „отворена“.
Тхе екамплеСоцкет објекат има слушалац догађаја (који се разликује од ДОМ слушаоци догађаја) под називом "онопен" који вам омогућава да извршите даље радње тек након што је веза успостављена. Објекат такође има метод „сенд“ који вам омогућава да шаљете стрингове, Блобс (бинарне податке) и АрраиБуфферс као поруке на сервер.
Ево примера коришћења ових заједно:
екамплеСоцкет.онопен = функција (догађај) {
екамплеСоцкет.сенд("ВебСоцкет је стварно кул");
};
АПИ такође пружа начин на који можете да реагујете на поруке које сервер шаље. Ово се ради помоћу слушаоца догађаја "онмессаге". Ево примера:
екамплеСоцкет.онмессаге = функција (догађај) {
конзола.Пријава(догађај.дата);
}
Уместо тога, можете и писати функција стрелице:
екамплеСоцкет.онмессаге = (догађај) => { конзола.лог (евент.дата); }
АПИ такође пружа а Близу() начин затварања везе. Ево како то изгледа:
екамплеСоцкет.Близу();
ВебСоцкет омогућава ефикасну двосмерну комуникацију
ВебСоцкет је двосмерни комуникациони протокол. Сервери и претраживачи имплементирају стекове протокола за комуникацију користећи ВебСоцкет. ВебСоцкет постоји јер ХТТП није дизајниран да буде двосмеран. Постоје методе за имплементацију двосмерних веза са ХТТП-ом, али имају проблема.
ВебСоцкет је моћна технологија, али није неопходан у свим случајевима, јер може значајно да закомпликује архитектуру апликације. Коришћење ВебСоцкет-а на страни клијента се врши помоћу АПИ-ја ВебСоцкет претраживача.