Junior
Ի՞նչ են վեբ-սոքետները։
sobes.tech AI
Պատասխան AI-ից
Websockets (Websockets) ը երկկողմ կապի պրոտոկոլ է, որը աշխատում է մեկ TCP կապի վրա և թույլ է տալիս փոխանակել տվյալներ բրաուզերի և սերվերի միջև իրական ժամանակում:
Հիմնական տարբերությունները ավանդական HTTP հարցումների նկատմամբ՝
- Երկկողմ կապ: Սերվերը կարող է ուղարկել տվյալներ հաճախորդին առանց նախնական հարցման:
- Մի կապ: Կարգավորվում է մեկ երկարատև կապ, ինչը վերացնում է նոր կապի հաստատման ծախսերը յուրաքանչյուր տվյալների փոխանակման համար (ինչպես HTTP-ում):
- Հապաղումի նվազեցում: Փոքր ժամանակ է պահանջվում կապի հաստատման, գլխագրերի փոխանակման և կարճ հարցումների/պատասխանների մշակման համար:
Աշխատանքի սկզբունք:
- Handshake: Բրաուզերը ուղարկում է հատուկ HTTP հարցում սերվերին (
Upgrade: websocketևConnection: Upgradeգլխագրերով): - Կապի հաստատում: Եթե սերվերը աջակցում է Websockets-ին, նա պատասխանում է
101 Switching Protocolsկոդով, և կապը անցում է Websocket պրոտոկոլ: - Տվյալների փոխանցում: Կապի հաստատումից հետո երկու կողմերն ազատորեն փոխանակվում են հաղորդագրություններով ցանկացած ժամանակ:
Օգտագործման օրինակներ:
- Օնլայն խաղեր
- Չատեր և մեսենջերներ
- Տվյալների իրական ժամանակի թարմացումներ (գիներ, նորություններ)
- Համագործակցային գործիքներ
Առավելություններ:
- Նվազում է հապաղումը
- Էֆեկտիվ օգտագործում ռեսուրսների (փոքր ավելորդ բեռ)
- Երկկողմ կապ իրական ժամանակում
Կամայականություններ:
- Պահանջում է աջակցություն ինչպես հաճախորդի (բրաուզերի), այնպես էլ սերվերի կողմից:
- Ավելի բարդ իրականացմանը համեմատ՝ պարզ HTTP հարցումներից:
Օրինակ JavaScript հաճախորդային կոդ:
// WebSocket ստեղծում
const socket = new WebSocket('wss://example.com/websocket');
// բացման ժամանակ handler
socket.onopen = function(event) {
console.log('Կապը հաստատված');
socket.send('Բարև, սերվեր!'); // ուղարկում հաղորդագրություն սերվերին
};
// հաղորդագրություն ստանալու handler
socket.onmessage = function(event) {
console.log('Սերվերից ստացված հաղորդագրություն՝ ' + event.data);
};
// կապի փակման handler
socket.onclose = function(event) {
if (event.wasClean) {
console.log(`Կապը մաքուր փակվեց, կոդ=${event.code} պատճառ=${event.reason}`);
} else {
console.log('Կապը ընդհատվեց'); // օրինակ՝ ցանցի խափանման պատճառով
}
};
// սխալի handler
socket.onerror = function(error) {
console.error(`WebSocket սխալ՝ ${error}`);
};
// կապը փակել (պահանջության դեպքում)
// socket.close();