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ěď.