Sobes.tech
Junior

Kokie protokolai egzistuoja duomenų mainams tarp serverio ir kliento?

sobes.tech AI

Atsakymas iš AI

Duomenų mainams tarp serverio ir kliento C# .NET naudojami įvairūs protokolai, kurių pasirinkimas priklauso nuo programėlės reikalavimų: greičio, patikimumo, saugumo, duomenų tipo ir formato:

Pagrindiniai protokolai:

  1. HTTP/HTTPS: Dažniausiai naudojami protokolai interneto programėlėms. HTTP (Hypertext Transfer Protocol) — taikomojo lygio protokolas hiperteksto informacijos perdavimui. HTTPS — jo plėtinys su šifravimu (SSL/TLS) saugumui užtikrinti:

    • Privalumai: plačiai palaikomi, paprastas naudoti, tinkamas "vieną kartą gauti duomenis" užklausoms/atsakymams.
    • Trūkumai: orientuotas į užklausą-atsakymą, neefektyvus srautiniam perdavimui ar nuolatiniam dvipusiam mainams.
  2. TCP/IP: Transporto protokolas (TCP - Transmission Control Protocol) ir tinklo protokolas (IP - Internet Protocol). TCP užtikrina garantuotą paketų pristatymą ir srauto valdymą. Tai pagrindas daugeliui aukštesnio lygio protokolų:

    • Privalumai: patikimumas, srauto valdymas, tinkamas bet kokio tipo duomenims.
    • Trūkumai: žemesnio lygio, reikalauja daugiau logikos apdorojimo programėlės pusėje.
  3. UDP/IP: Tinklo protokolas (UDP - User Datagram Protocol). Skirtingai nuo TCP, UDP ne garantuoja pristatymą ir paketų tvarką, tačiau turi mažesnes išlaidas.

    • Privalumai: didelis greitis, mažas delsimas, tinkamas srautiniam duomenų perdavimui (garsas, vaizdo įrašas), kur prarasti dalį informacijos leidžiama.
    • Trūkumai: nepatikimas, nevaldo tvarkos ir paketų praradimo.
  4. WebSocket: protokolas, užtikrinantis pilną dvipusį ryšį per vieną TCP jungtį. Leidžia tiek serveriui, tiek klientui siųsti duomenis bet kuriuo metu be nuolatinių užklausų.

    • Privalumai: pilnas dvipusis ryšys, mažas delsimas, efektyvus realaus laiko mainams.
    • Trūkumai: palaikymas gali skirtis senesniuose naršyklėse ar klientuose.
  5. gRPC: aukšto našumo RPC (Remote Procedure Call) sistema, sukurta Google. Naudoja HTTP/2 transportui ir Protocol Buffers serializacijai.

    • Privalumai: aukštas našumas, stiprios sutartys, srautinis perdavimas, palaikymas daugeliui kalbų.
    • Trūkumai: gali būti sudėtingiau nustatyti nei RESTful HTTP.
  6. .NET Remoting (pasenęs): pasenusi technologija .NET Framework skirtas tarpprocesinei sąveikai. Nerekomenduojama naujam kodui.

  7. WCF (Windows Communication Foundation) (skirtas .NET Framework): Microsoft vieninga sistema, skirta paskirstytų programų kūrimui. Palaiko įvairius protokolus (TCP, HTTP, MSMQ) ir žinučių formatus.

    • Privalumai: lankstumas, palaiko skirtingus protokolus ir formatus, saugumas.
    • Trūkumai: sudėtingumas, specifinis tik .NET, mažiau aktualus .NET Core+.
  8. ASP.NET Core SignalR: biblioteka ASP.NET Core, palengvinanti realaus laiko funkcionalumo pridėjimą programoms. Naudoja WebSocket, Server-Sent Events ar Long Polling kaip transportą.

    • Privalumai: paprastas realaus laiko funkcijų įgyvendinimas, automatinis geriausio transporto pasirinkimas.
    • Trūkumai: orientuotas į žiniatinklio scenarijus.

Pavyzdys naudojant HTTP klientą C#:

// using System.Net.Http;
// using System.Threading.Tasks;

public async Task<string> GetDataFromApiAsync(string url)
{
    using (HttpClient client = new HttpClient())
    {
        try
        {
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode(); // išmeta išimtį, jei statuso kodas nėra sėkmingas
            string responseBody = await response.Content.ReadAsStringAsync();
            return responseBody;
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine($"HTTP klaida: {e.Message}");
            return null;
        }
    }
}

Paprastas TCP serverio pavyzdys:

// using System.Net;
// using System.Net.Sockets;
// using System.Text;
// using System.Threading.Tasks;

public async Task StartTcpServerAsync(int port)
{
    TcpListener server = null;
    try
    {
        IPAddress localAddr = IPAddress.Loopback; // arba IPAddress.Any
        server = new TcpListener(localAddr, port);

        server.Start();
        Console.WriteLine($"TCP serveris pradėtas {localAddr}:{port}");

        while (true)
        {
            Console.WriteLine("Laukiama jungties...");
            TcpClient client = await server.AcceptTcpClientAsync();
            Console.WriteLine("Jungtis sėkmingai užmegzta!");

            // Realiame taikomojoje programoje ryšio apdorojimą reikėtų atlikti atskiroje sraute ar Task'e
            NetworkStream stream = client.GetStream();

            byte[] buffer = new byte[256]; // Duomenų skaitymo buferis
            int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
            string data = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine($"Gauta: {data}");

            // Atsakymo siuntimas
            byte[] msg = Encoding.UTF8.GetBytes("Sveiki, klient!");
            await stream.WriteAsync(msg, 0, msg.Length);
            Console.WriteLine("Išsiųsta: Sveiki, klient!");

            client.Close();
        }
    }
    catch (SocketException e)
    {
        Console.WriteLine($"Socket klaida: {e.Message}");
    }
    finally
    {
        server?.Stop();
    }
}

Protokolo pasirinkimas priklauso nuo konkrečių reikalavimų. Standartinė API sąveika dažnai vyksta per HTTP/HTTPS. Realių laikų programoms, pavyzdžiui, pokalbiams, geriau naudoti WebSocket arba SignalR. Aukšto našumo tarp paslaugų komunikacijai gali būti tinkamas gRPC.