Programavimas

Kaip dirbti su lizdais C #

Tarpprocesinė komunikacija yra galimybė keistis duomenimis tarp dviejų ar daugiau susijusių procesų ir gali būti pasiekta naudojant lizdus. Užmezgę ryšį tarp serverio ir kliento, t.y., serverio procesas ir kliento procesas, jie gali bendrauti keisdamiesi duomenimis naudodamiesi lizdais.

Lizdas yra galutinis dviejų krypčių ryšio tarp dviejų tinkle vykstančių procesų taškas. Galite naudoti „System.Net“ ir „System.Net.Sockets“ vardų sritis, kad galėtumėte dirbti su lizdais C #. Pirmasis naudojamas aukšto lygio operacijoms naudojant lizdus, ​​antrasis naudojamas bet kokioms žemo lygio operacijoms dirbant su lizdais.

Dirbdami su lizdais galite naudoti TCP / IP (perdavimo valdymo protokolas / interneto protokolas) arba UDP / IP (vartotojo duomenų tinklų protokolas / interneto protokolas) ryšio mechanizmus. Norėdami mainytis duomenimis tarp dviejų ar daugiau procesų tinkle, galite pasinaudoti TCP ir UDP perdavimo protokolais. Nors TCP (perdavimo valdymo protokolas) yra saugus ir patikimas į ryšį orientuotas protokolas, UDP („User Datagram Protocol“) yra palyginti ne toks saugus ar patikimas, greitas ir be ryšio protokolas.

Šis kodų sąrašas parodo, kaip galite pasinaudoti „System.Net.Dns“ klasės pranašumais norėdami parodyti savo sistemos IP adresą.

public static void Main (string [] args)

        {

eilutė hostName = Dns.GetHostName ();

bandyti

            {

IPAddress [] ipAddress = Dns.Resolve (hostName) .AddressList;

foreach („IPAddress“ adresas „ipAddress“)

Console.WriteLine („{0} / {1}“, hostName, adresas);

            }

sugavimas (ex išimtis)

            {

Console.WriteLine ("Įvyko klaida:" + ex.Message);

            }

Pultas.Skaitykite ();

        }

Žr. Aukščiau pateiktą kodų sąrašą. Nors metodas Dns.GetHostName () grąžina sistemos pavadinimą, metodas Dns.Resolve () naudojamas norint gauti IPHostEntry tipo masyvą.

Gaunama tinklo informacija

„System.Net.NetworkInformation“ vardų sritis galima naudoti tinklo metaduomenims (t. Y. Tinklo pakeitimams, tinklo įvykiams, ypatybėms ir kt.) Nuskaityti C #. Pavyzdžiui, jei norite patikrinti, ar yra tinklo ryšys, galite naudoti metodą „GetIsNetworkAvailable ()“, kaip parodyta žemiau.

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable ();

Štai kaip galite vadinti šį metodą savo kode.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable ();

Jei norite stebėti IP adreso pokyčius, galite naudoti šiuos „NetworkChange“ klasės įvykius.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

Norėdami gauti informacijos apie tinklo sąsajas, galite naudoti klasės „NetworkInterface“ metodą GetAllNetworkInterfaces ().

NetworkInterface [] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces ();

Gavę visų tinklo sąsajų sąrašą, galite naudoti šį kodo elementą, kad konsole rodytumėte kiekvienos tinklo sąsajos informaciją.

foreach („NetworkInterface networkInterface in networkInterfaces“)

            {

„Console.WriteLine“ („Tinklo ID:“ + tinklo sąsajos ID);

Console.WriteLine ("Tinklo pavadinimas:" + networkInterface.Name);

Console.WriteLine ("Tinklo aprašas \ n:" + networkInterface.Description);

            }

Čia yra visas jūsų kodo sąrašas.

static void Main (string [] args)

        {

NetworkInterface [] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces ();

foreach („NetworkInterface networkInterface in networkInterfaces“)

            {

„Console.WriteLine“ („Tinklo ID:“ + tinklo sąsajos ID);

Console.WriteLine ("Tinklo pavadinimas:" + networkInterface.Name);

Console.WriteLine ("Tinklo aprašas \ n:" + networkInterface.Description);

            }

Pultas.Skaitykite ();

        }

Kliento-serverio programavimas

Dirbdami su tinklo programavimu naudodami TCP, paprastai turėsite sukurti serverio procesą, kuris turėtų prasidėti tam tikrame prievade, taip pat kliento procesą, kuris gali prasidėti bet kuriame uoste ir išsiųsti ryšio užklausą serveriui. Serverio procesas po jo paleidimo klauso gaunamų prisijungimo užklausų uoste, kuriame jis buvo paleistas. Šis kodo fragmentas parodo, kaip galite pasinaudoti „System.Net.Sockets.TcpListener“ klase ir naudoti ją kartu su „socket“ klase.

TcpListener klausytojas = naujas TcpListener (1234);

klausytojas.Pradėti ();

Lizdo lizdas = klausytojas. AcceptSocket ();

Srautas networkStream = naujas NetworkStream (lizdas);

Šis kodo fragmentas parodo, kaip jūsų „socket“ klientas gali prisijungti prie serverio naudodamas TCP protokolą.

String ipAddress = "čia nurodykite IP adresą";

System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse (ipAddress);

System.Net.IPEndPoint remoteEndPoint = naujas IPEndPoint („ipAddress“, 9000);

socketClient.Connect (remoteEndPoint);

Norėdami siųsti duomenis į serverį iš kliento, galite naudoti šį kodo fragmentą.

bandyti

{

Eilutės tekstas = "Labas pasaulis!";

baitas [] duomenys = sistema.Text.Encoding.ASCII.GetBytes (tekstas);

socketClient.Send (duomenys);

}

gaudyti („SocketException se“)

{

// Čia parašykite savo išimčių tvarkymo kodą

}

Duomenims gauti gali būti naudojamas lizdų klasės „Receive“) metodas. Štai kaip galite jį naudoti, norėdami gauti duomenis iš lizdo. Atkreipkite dėmesį, kad tiek siuntimo, tiek gavimo būdai blokuojami, t. Y. Jie blokuos šiuo metu vykdomą giją, kol duomenys bus išsiųsti ar gauti.

baitas [] duomenys = naujas baitas [1024];

int i = socketClient.Gauti (duomenys);

Atminkite, kad turėtumėte įtraukti System.Net ir System.Net.Sockets vardų sritis į savo programą, kad galėtumėte dirbti su lizdais.

naudojant System.Net;

naudojant „System.Net.Sockets“;