Sobes.tech
Junior

Ի՞նչ են վեբ-սոքետները։

sobes.tech AI

Պատասխան AI-ից

Websockets (Websockets) ը երկկողմ կապի պրոտոկոլ է, որը աշխատում է մեկ TCP կապի վրա և թույլ է տալիս փոխանակել տվյալներ բրաուզերի և սերվերի միջև իրական ժամանակում:

Հիմնական տարբերությունները ավանդական HTTP հարցումների նկատմամբ՝

  • Երկկողմ կապ: Սերվերը կարող է ուղարկել տվյալներ հաճախորդին առանց նախնական հարցման:
  • Մի կապ: Կարգավորվում է մեկ երկարատև կապ, ինչը վերացնում է նոր կապի հաստատման ծախսերը յուրաքանչյուր տվյալների փոխանակման համար (ինչպես HTTP-ում):
  • Հապաղումի նվազեցում: Փոքր ժամանակ է պահանջվում կապի հաստատման, գլխագրերի փոխանակման և կարճ հարցումների/պատասխանների մշակման համար:

Աշխատանքի սկզբունք:

  1. Handshake: Բրաուզերը ուղարկում է հատուկ HTTP հարցում սերվերին (Upgrade: websocket և Connection: Upgrade գլխագրերով):
  2. Կապի հաստատում: Եթե սերվերը աջակցում է Websockets-ին, նա պատասխանում է 101 Switching Protocols կոդով, և կապը անցում է Websocket պրոտոկոլ:
  3. Տվյալների փոխանցում: Կապի հաստատումից հետո երկու կողմերն ազատորեն փոխանակվում են հաղորդագրություններով ցանկացած ժամանակ:

Օգտագործման օրինակներ:

  • Օնլայն խաղեր
  • Չատեր և մեսենջերներ
  • Տվյալների իրական ժամանակի թարմացումներ (գիներ, նորություններ)
  • Համագործակցային գործիքներ

Առավելություններ:

  • Նվազում է հապաղումը
  • Էֆեկտիվ օգտագործում ռեսուրսների (փոքր ավելորդ բեռ)
  • Երկկողմ կապ իրական ժամանակում

Կամայականություններ:

  • Պահանջում է աջակցություն ինչպես հաճախորդի (բրաուզերի), այնպես էլ սերվերի կողմից:
  • Ավելի բարդ իրականացմանը համեմատ՝ պարզ 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();