WebSocket е неразделна технология в много съвременни уеб приложения. Ако пишете код за мрежата, вероятно сте чували термина преди, но може би не сте сигурни какво точно представлява или как да го използвате. За щастие, WebSocket не е сложна концепция и можете да получите основно разбиране за нея доста бързо.
Какво е WebSocket?
WebSocket, за съжаление, е едно от онези имена, които на пръв поглед нямат смисъл. WebSocket всъщност е името на a комуникационен протокол което позволява двупосочна комуникация между клиента и уеб сървъра.
По-просто казано, WebSocket е технология, която позволява на клиент и сървър да създадат връзка, при която всяка страна може да изпрати на другата съобщение по всяко време.
Това е различно от обикновената HTTP връзка, при която клиентът трябва да инициира заявка и едва тогава сървърът може да изпрати отговор. Всъщност WebSocket е напълно различен комуникационен протокол от HTTP, който е проектиран да бъде HTTP-съвместим. Когато клиентско приложение иска да инициира WebSocket връзка, то трябва да използва
HTTP механизъм за надграждане за да преминете към протокола WebSocket.В този момент може би си мислите: „протоколът е просто набор от правила, как можете да го използвате за кодиране?“.
Липсващото парче е нещо, наречено a протоколен стек. По същество устройствата, които поддържат протокол, имат вграден хардуер и софтуер, които ви позволяват да пишете приложения, които комуникират с помощта на протокола. Протоколът не се използва директно за изграждане на нищо.
Защо е създаден WebSocket?
За да илюстрирате нуждата от WebSocket, помислете за механизма зад чата в интернет.
Някой изпраща съобщение до чат сървъра от своето устройство, но сървърът все още трябва да изпрати това съобщение до вашето устройство, преди да можете да го прочетете. Ако сървърът използва HTTP, сървърът не може директно да препрати това съобщение до вас, защото сървърът не може да инициира заявки.
Има няколко начина за отстраняване на този проблем с HTTP. Един от начините е клиентът постоянно да изпраща заявки за актуализиране до сървъра и сървърът ще препрати всички данни, които има в отговора. Тази техника се нарича анкета и всяка заявка се нарича анкета. Има два варианта на анкетиране: дълго анкетиране и кратко анкетиране.
Използването на варианта за дълго запитване означава, че клиентското устройство непрекъснато пита сървъра дали има нови съобщения. Ако има нови съобщения, сървърът ще изпрати съобщенията като отговор. Ако не, сървърът ще забави отговора и ще задържи отворена връзката, докато има данни за изпращане обратно, след което клиентът незабавно ще направи нова заявка.
Тази техника е неефективна, тъй като HTTP не е проектиран да се използва по този начин. Работи адекватно в малък мащаб, но всяка HTTP заявка включва изпращане на допълнителни данни в заглавка и това води до значително увеличено натоварване на сървъра, когато много клиенти анкетират то.
Ето диаграма, илюстрираща дълго анкетиране:
Вариантът с кратко анкетиране е още по-малко ефективен. При кратко анкетиране сървърът не поддържа връзката отворена, докато няма нови данни, което означава, че клиентът трябва да продължи да анкетира сървъра на фиксирани, много кратки интервали.
Друга техника за двупосочна комуникация в HTTP се нарича стрийминг.
При поточно предаване, след изпращане на първата заявка, сървърът държи връзката отворена за неопределено време, като изпраща нови части от информация като непрекъснати частични отговори на клиента.
Използването на стрийминг води до по-малки разходи за данни и натоварване на сървъра, отколкото анкетиране, тъй като в идеалния случай клиентът прави само една HTTP заявка. За съжаление стриймингът създава проблеми при определени условия, тъй като браузърите и мрежовите посредници (като проксита) често се опитват да се справят с частични отговори като счупени части от един голям HTTP отговор (което е нормално HTTP поведение), вместо като отделни съобщения, за които са били предназначени бъда.
WebSocket е създаден, за да реши тези проблеми. За разлика от HTTP, WebSocket е проектиран специално за двупосочна комуникация. С WebSocket, след като връзката е отворена, клиентът и сървърът могат да изпращат съобщения напред и назад без проблеми с анкетиране или стрийминг.
Случаи на употреба за WebSocket
WebSocket е страхотен, но това не означава, че трябва да се използва навсякъде.
Внедряването на WebSocket може да усложни вашето приложение, особено от страна на сървъра, така че не трябва да се прави, освен ако нямате основателна причина. Това повдига въпроса: как изглежда добрата причина?
WebSocket е идеален за случаи на употреба, при които се изисква честа двупосочна комуникация с ниска латентност. С други думи, WebSocket осигурява предимство за приложения, които трябва да комуникират често или в голям мащаб. Ако не е необходимо комуникацията да е в реално време или приложението никога няма да достигне голям мащаб, анкетирането или стриймингът може да са достатъчни за използване в това приложение.
Типичните употреби на WebSocket са в изграждането на приложения за чат, онлайн мултиплейър игри, сътрудничество в реално време и софтуер за уведомяване и др.
Как да използвате WebSocket от страна на клиента
Използването на WebSocket от страна на сървъра може да бъде доста ангажиращо и процесът варира значително в зависимост от езика (като ° С#, Javaи др.) и библиотека по избор, така че няма да го разглеждаме тук. След това ще обсъдим накратко как да използвате WebSocket от страна на клиента.
Всички съвременни браузъри внедряват уеб API, наречен API на WebSocket, който е протоколният стек на браузъра за протокола WebSocket. Можете да използвате WebSocket в JavaScript с помощта на този API. API ви позволява да създадете WebSocket обект, чрез който създавате WebSocket връзка и взаимодействате с WebSocket сървъра.
Можете да използвате следния кодов формат, за да създадете WebSocket обект:
нека exampleSocket = нов WebSocket("wss://www.example.com/socketserver", "dummyProtocol");
Първият аргумент на конструктора е URI на WebSocket сървъра, с който искате да създадете връзка. Винаги ще започва с "ws" или "wss". Вторият аргумент не е задължителен. Стойността му е или низ, или масив от низове, който указва подпротоколите, които поддържате.
Обектът WebSocket има свойство само за четене, наречено readyState. Достъпът до това свойство предоставя текущото състояние на връзката WebSocket. readyState има четири възможни стойности: "свързване", "отворено", "затваряне" и "затворено".
Когато този ред от код се изпълни, браузърът ще се опита да се свърже с посочения сървър. Връзката няма да бъде завършена наведнъж, така че readyState на exampleSocket ще бъде „свързване“. Никакви съобщения не могат да се изпращат или получават, докато връзката не бъде завършена, в който момент стойността на readyState ще стане "open".
The exampleSocket обектът има слушател на събития (който е различен от Слушатели на DOM събития), наречен "onopen", който ви позволява да извършвате допълнителни действия само след като връзката е установена. Обектът също има метод "изпращане", който ви позволява да изпращате низове, Blobs (двоични данни) и ArrayBuffers като съобщения до сървъра.
Ето пример за използване на тези заедно:
exampleSocket.onopen = функция (събитие) {
exampleSocket.send("WebSocket е наистина готин");
};
API също така предоставя начин да можете да реагирате на съобщенията, които сървърът изпраща. Това се прави с слушателя на събития "onmessage". Ето един пример:
exampleSocket.onmessage = функция (събитие) {
конзола.дневник(събитие.данни);
}
Вместо това можете също да пишете функция със стрелка:
exampleSocket.onmessage = (събитие) => { конзола.log (данни за събитие); }
API също предоставя a близо() метод за затваряне на връзката. Ето как изглежда:
exampleSocket.близо();
WebSocket позволява ефективна двупосочна комуникация
WebSocket е двупосочен комуникационен протокол. Сървърите и браузърите прилагат протоколни стекове за комуникация чрез WebSocket. WebSocket съществува, защото HTTP не е проектиран да бъде двупосочен. Има методи за прилагане на двупосочни връзки с HTTP, но те имат проблеми.
WebSocket е мощна технология, но не е необходима във всички случаи, тъй като може значително да усложни архитектурата на приложението. Използването на WebSocket от страна на клиента се извършва с API на браузъра WebSocket.