Sobes.tech
Junior

Նկարագրեք սերվերի և հաճախորդի միջև կապի մի քանի եղանակներ։

sobes.tech AI

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

Կան մի քանի հիմնական եղանակներ կապի միջև հաճախորդի (բրաուզերի) և սերվերի միջև:

  1. HTTP/HTTPS (Polling/Short Polling):

    • Հաճախորդը ուղարկում է հարցում սերվերին և սպասում պատասխանին:
    • Սերվերը մշակել է հարցումը և ուղարկում պատասխան:
    • Short Polling-ում հաճախորդը ժամանակ առ ժամանակ ուղարկում է հարցումներ սերվերին՝ ստուգելու համար արդյոք կան նորացումներ:
    • Պարզ է իրականացման համար, բայց ոչ արդյունավետ հաճախակի նորացումների դեպքում՝ յուրաքանչյուր հարցման համար ավելորդ ծախսերի պատճառով:
    // Պարզ Short Polling-ի օրինակ
    function checkUpdates() {
      fetch('/api/updates')
        .then(response => response.json())
        .then(data => {
          // Տվյալների մշակումը
        })
        .finally(() => {
          setTimeout(checkUpdates, 5000); // կրկնել 5 վայրկյան հետո
        });
    }
    
    checkUpdates();
    
  2. Long Polling:

    • Հաճախորդը ուղարկում է հարցում սերվերին, որը պահում է այն բաց, մինչև որ հայտնվեն նոր տվյալներ կամ չանցնի ժամանակային սահմանափակումը:
    • Երբ տվյալները հայտնվում են, սերվերը անմիջապես ուղարկում է պատասխան, և հաճախորդը ուղարկում է նոր հարցում:
    • Ավելի արդյունավետ, քան Short Polling-ը, բայց դեռ կա ուշացում տվյալների ստացման և հաջորդ հարցման ուղարկման միջև:
  3. WebSockets:

    • Ստեղծում է մշտական երկկողմանի կապ հաճախորդի և սերվերի միջև:
    • Կապի հաստատումից հետո, երկու կողմերն էլ կարող են ցանկացած ժամանակ ուղարկել և ստանալ տվյալներ՝ առանց լրացուցիչ HTTP հարցումների:
    • Իդեալական է ռեալ ժամանակի հավելվածների համար (չատեր, օնլայն խաղեր, ծանուցումներ):
    const socket = new WebSocket('ws://localhost:8080');
    
    socket.onopen = function(event) {
      console.log('Կապը հաստատված');
      socket.send('Բարև, սերվեր!');
    };
    
    socket.onmessage = function(event) {
      console.log('Սերվերից ստացված հաղորդագրություն:', event.data);
    };
    
    socket.onclose = function(event) {
      if (event.wasClean) {
        console.log(`Կապը մաքուր փակվեց, կոդ=${event.code}, պատճառ=${event.reason}`);
      } else {
        console.error('Կապը ընդհատվեց');
      }
    };
    
    socket.onerror = function(error) {
      console.error('WebSocket սխալ:', error);
    };
    
  4. Server-Sent Events (SSE):

    • Սերվերը կարող է ուղարկել տվյալներ հաճախորդին միակողմանի HTTP կապով:
    • Հաճախորդը բաժանորդագրվում է սերվերից ստացվող իրադարձությունների հոսքին:
    • Օգտակար է այն դեպքերում, երբ սերվերը ուղարկում է նորացումներ հաճախորդին, բայց հաճախորդը չի ուղարկում տվյալներ սերվերին (օրինակ՝ նորությունների հոսք, առաջընթացի ցուցադրում):
    const eventSource = new EventSource('/api/stream');
    
    eventSource.onmessage = function(event) {
      console.log('Սերվերից ստացված իրադարձություն:', event.data);
    };
    
    eventSource.onerror = function(error) {
      console.error('SSE սխալ:', error);
      eventSource.close(); // Կապը փակել սխալի դեպքում
    };
    

Յուրաքանչյուր մեթոդ ունի իր առավելությունները և թերությունները, և ընտրությունը կախված է հավելվածի կոնկրետ պահանջներից՝ թարմացումների հաճախականությունից, տվյալների ծավալից և երկկողմ կապի անհրաժեշտությունից։