Sobes.tech
Junior

Aprašykite keletą būdų, kaip serveris ir klientas gali bendrauti.

sobes.tech AI

Atsakymas iš AI

Yra keletas pagrindinių būdų, kaip bendrauja klientas (naršyklė) ir serveris.

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

    • Klientas siunčia užklausą serveriui ir laukia atsakymo.
    • Serveris apdoroja užklausą ir siunčia atsakymą.
    • Short Polling atveju, klientas periodiškai siunčia užklausas serveriui, kad patikrintų naujienas.
    • Paprasta įgyvendinti, bet neefektyvu dažnoms naujinimams dėl papildomų išlaidų kiekvienam užklausimui.
    // Pavyzdys paprasto Short Polling
    function checkUpdates() {
      fetch('/api/updates')
        .then(response => response.json())
        .then(data => {
          // Apdoroti gautus duomenis
        })
        .finally(() => {
          setTimeout(checkUpdates, 5000); // Kartoti po 5 sekundžių
        });
    }
    
    checkUpdates();
    
  2. Long Polling:

    • Klientas siunčia užklausą serveriui, kuris ją laiko atvirą, kol neatsiranda nauji duomenys arba nepasibaigia laiko limitas.
    • Kai duomenys atsiranda, serveris nedelsdamas siunčia atsakymą, o klientas siunčia naują užklausą.
    • Efektyviau nei Short Polling, bet vis dar yra delsimas tarp duomenų gavimo ir kitos užklausos siuntimo.
  3. WebSockets:

    • Sukuria nuolatinį, dvipusį ryšį tarp kliento ir serverio.
    • Po ryšio sukūrimo, abi pusės gali siųsti ir gauti duomenis bet kuriuo metu be papildomų HTTP užklausų.
    • Idealiai tinka realaus laiko programoms (chatai, internetiniai žaidimai, pranešimai).
    const socket = new WebSocket('ws://localhost:8080');
    
    socket.onopen = function(event) {
      console.log('Ryšys užmegztas');
      socket.send('Sveiki, server!');
    };
    
    socket.onmessage = function(event) {
      console.log('Gauta žinutė iš serverio:', event.data);
    };
    
    socket.onclose = function(event) {
      if (event.wasClean) {
        console.log(`Ryšys užbaigtas švariai, kodas=${event.code}, priežastis=${event.reason}`);
      } else {
        console.error('Ryšys nutrauktas');
      }
    };
    
    socket.onerror = function(error) {
      console.error('WebSocket klaida:', error);
    };
    
  4. Server-Sent Events (SSE):

    • Leidžia serveriui siųsti duomenis klientui vienpusiai per HTTP ryšį.
    • Klientas prenumeruoja įvykių srautą iš serverio.
    • Tinka situacijoms, kai serveris siunčia atnaujinimus klientui, bet klientas neatsako duomenimis (pvz., naujienų srautas, užduoties progreso rodymas).
    const eventSource = new EventSource('/api/stream');
    
    eventSource.onmessage = function(event) {
      console.log('Gauta įvykių iš serverio:', event.data);
    };
    
    eventSource.onerror = function(error) {
      console.error('SSE klaida:', error);
      eventSource.close(); // Užverti ryšį klaidos atveju
    };
    

Kiekvienas metodas turi savo privalumus ir trūkumus, ir pasirinkimas priklauso nuo konkrečių programos reikalavimų dėl atnaujinimų dažnumo, duomenų kiekio ir dvipusės ryšio poreikio.