reklama

Poznáváme C# a Microsoft. NET 67. díl – přístup k internetu pomocí třídy WebClient

Dnešní díl je úvodním dílem do problematiky implementace aplikací pro platformu .NET, které pracují v počítačové síti. Jako první se seznámíme s velmi přátelskou třídou WebClient.

Síťové aplikace a platforma .NET

V případě, že se při tvorbě svého projektu na platformě MS .NET dostanete do situace, ve které budete potřebovat pomocí síťových protokolů komunikovat s webovými servery nebo obecněji s jakýmikoli jinými počítači, které jsou připojeny do sítě nemusíte se bát neúspěchu.

V základní knihovně tříd .NET frameworku totiž nalezneme nemalý počet typů, které nám na různých úrovních abstrakce zprostředkovávají využití komunikace pomocí některého ze síťových protokolů. Většinu z těchto typů nalezneme ve jmenném prostoru System.Net případně System.Net.Sockets.

Takže pokud nám jde pouze o stažení dat z nějakého vzdáleného počítače, použijeme třídu poskytující vysokou úroveň abstrakce a nemusíme se prakticky starat o mnohé z detailů, které jsou typicky při implementaci síťových aplikací zapotřebí.

Ovšem pokud chceme pracovat na nižší úrovni, tedy přímo využívat vlastnosti a služeb jednotlivých síťových protokolů jako jsou HTTP, TCP či UDP, máme možnost využít typy, které nám takovýto specifický přístup umožňují. Architektura subsystému pro práci se síťovými prostředky mimo jiné umožňuje implementaci ovladačů pro vlastní protokoly, která je velmi jednoduchá (implementace předepsaných rozhraní).

Třída WebClient

Myslím, že není příjemnějšího úvodu do světa práce se síťovými prostředky než třída WebClient ze jmenného prostoru System.Net . Tato třída poskytuje velmi vysokou úroveň abstrakce pro stahování dat z webových serverů nebo naopak pro jejich posílání (Upload), takže se nemusíme zaobírat detaily, které souvisejí s vlastní komunikací.

Cesta k jednotlivým síťovým zdrojům, se kterými má instance třídy WebClient pracovat je zadávána pomocí URI (Uniform Resource Identifier). .NET framework ve verzi 1.1 umožňuje v URI použit identifikátory http: , https: a file:.

Stahování dat pomocí třídy WebClient

Pokud chceme stahovat dat z webového serveru pomocí třídy WebClient máme na výběr ze dvou možností realizace. První možností je prosté uložení staženého souboru na disk, což provedeme pomocí metody DownloadFile.

WebClient client = new WebClient();
Console.Write("Zadejte URI (napr.
) : ");
//nacteme URI
string uri = Console.ReadLine();
Console.Write("Zadejte nazev stazeneho souboru (napr. C:/new.txt) :");
//nacteme kam se ma soubor ulozit
string fileName = Console.ReadLine();
try
{
  //stahneme soubor
  client.DownloadFile(uri, fileName);
  Console.WriteLine("Soubor byl uspesne stazen.");
}
catch(WebException ex)
{
  Console.WriteLine("Pri stahovani souboru doslo k vyjimce : {0}", ex.ToString());
}

Jak vidíte, tak použití třídy WebClient je jednoduché. Ke stažení souboru zadáme metodě DownloadFile dva argumenty, kde prvním je URI souboru, který má být stažen a druhým je cesta kam mám být soubor uložen.

Pokud získat data souboru, jež je specifikován URI, ve formě bajtů, použijeme za tímto účelem metodu DownloadData. Následující příklad je napsán tak, že očekává data představující text.

WebClient client = new WebClient();
//nacteme URI zdroje
Console.Write("Zadejte URI (napr.
) : ");
string uri = Console.ReadLine();
try
{
  Console.WriteLine("Stahuji {0} ...", uri);
  //stahneme data jako pole bajtu
  byte[] data = client.DownloadData(uri);
  Console.WriteLine("Velikost nactenych dat : {0} bajtu", data.Length);
  //prevedeme pole bajtu na text
  string textContent = Encoding.ASCII.GetString(data);
  Console.WriteLine(textContent);
}
catch(WebException ex)
{
  Console.WriteLine("Pri stahovani souboru doslo k vyjimce : {0}", ex.ToString());
}

Metoda DownloadData vrací data, která jsou reprezentována polem bajtů. Pokud je stahovaný soubor textového obsahu, musíme tyto bajty dekódovat, což je v příkladu učiněno pomocí podpory pro znakové kódování – třídou Encoding.

Získáni datového proudu ke vzdálenému souboru

Jiným způsobem, kterým lze získat obsah vzdáleného souboru je získání jeho datového proudu. Tento datový proud získáme opět pomocí instance třídy WebClient a jeho metody OpenRead, která vrací referenci typu Stream ze jmenného prostoru System.IO. Pokud by vzdálený soubor byl textový mohl by jednoduchý webový klient vypadat třeba následovně:

WebClient client = new WebClient();
//nacteme URI
Console.Write("Zadejte URI (napr.
) : ");
string uri = Console.ReadLine();
Stream strm = null;
try
{
  Console.WriteLine("Pristupuji k {0} ...", uri);
  //otevevreme proud k cilovemu souboru
  strm = client.OpenRead(uri);
  StreamReader reader = new StreamReader(strm);
  //nacteme obsah souboru
string content = reader.ReadToEnd();
  Console.WriteLine(content);
}
catch(WebException ex)
{
  Console.WriteLine("Pri stahovani souboru doslo k vyjimce : {0}", ex.ToString());
}
finally
{
  if (strm != null)
  {
    strm.Close();
  }
}

Díky tomu, že jsme s datovým proudem asociovali instanci známé třídy StreamReader mohli jsme celý obsah souboru načíst pomocí metody ReadToEnd.

Pomocí metody OpenRead lze získat datový proud, ze kterého jsme schopni data číst. Pokud bychom chtěli získat datový proud, který bychom mohli využít k zápisu, použijeme analogicky metodu OpenWrite.

//nacteme URI
Console.Write("Zadejte URI (napr.
file://C:/file.txt) : ");
string uri = Console.ReadLine();
Console.Write("Zadejte text, ktery ma byt zapsan : ");
string text = Console.ReadLine();
WebClient client = new WebClient();
StreamWriter writer = null;
try
{
  //otevreme proud pro zapis
  Stream strm = client.OpenWrite(uri);
  //pomoci instance tridy StreamWriter zapiseme text
  writer = new StreamWriter(strm);
  writer.WriteLine(text);
  Console.WriteLine("Text byl uspesne zapsan do {0}", uri);
}
catch(WebException ex)
{
  Console.WriteLine(ex.ToString());
}
finally
{
  if (writer != null)
  {
    writer.Close();
  }
}

Příklady ke článku jsou ke stažení zde.

Příště se podíváme na implementaci síťových aplikací využívající architekturu požadavek/odpověď.

Témata článku: Software, Microsoft, Programování, Catch, Proud, MA

1 komentář

Nejnovější komentáře

  • gully, gully 27. 6. 2006 23:55:57
    Off-line verzi seriálu si můžete stáhnout z...
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 100

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 34

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

** Novinka od Asusu míří přímo proti MacBooku od Applu ** Nabídne daleko více výkonu za stejné peníze

2.  12.  2016 | David Polesný | 145

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 73


reklama