Hlavní navigace

Síťování v Javě: Závěr

Martin Majer

Na úplný závěr našeho seriálu o síťování v Javě si probereme to, co se zatím do předchozích dílů nevešlo. Ukážeme si, jak pracovat se síťovými rozhraními a zkusíme si práci s HTTP protokolem. Nakonec nás čeká už jen krátké povídání o třídě Charset z balíku java.nio.charset.

Síťová rozhraní

Síťové rozhraní je v Javě reprezentováno třídou NetworkInterface z balíku java.net. Můžeme ho získat statickými továrními metodami getByInetAddres­s(InetAddress addr) a getByName(String name). Další možností je metoda getNetworkInter­faces(), která vrátí enumerátor Enumeration<Net­workInterface> pro všechna síťová rozhraní.

Třída NetworkInterface dále poskytuje metody pro získání informací o daném rozhraní:

  • String getName() – Vrátí jméno síťového rozhraní.
  • String getDisplayName() – Vrátí popis síťového rozhraní.
  • Enumeration<I­netAddress> getInetAddresses() – Vrátí výčet adres příslušících tomuto rozhraní.

Výpis všech síťových rozhraní

for(Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        interfaces.hasMoreElements();) {
    NetworkInterface intfc = interfaces.nextElement();
    System.out.print(intfc.getName() + "\t");

    for(Enumeration<InetAddress> addresses = intfc.getInetAddresses();
            addresses.hasMoreElements();) {
        InetAddress addr = addresses.nextElement();
        System.out.print(addr + "\t");
    }
    System.out.println();
} 

V případě chyby může metoda getNetworkInter­faces() vyvolat výjimku java.io.Socke­tException.

HTTP protokol

API obsažené v balíku java.net také poskytuje poměrně jednoduchý mechanismus pro práci s HTTP protokolem. Základem je třída URLConnection, která vytváří připojení na zadané URL. V balíku java.net má dvě podtřídy – JarURLConnection pro stahování JAR archivů a HttpURLConnection pro práci s HTTP protokolem.

Připojení k serveru

Pro připojení na zadané URL slouží metoda openConnection() třídy java.net.URL. Podle použitého protokolu vrátí instanci některé z podtříd URLConnection. V našem případě to tedy bude objekt typu HttpURLConnection.

Objekt získaný touto metodou je připravený ke stažení dokumentu na zadaném URL.

Přesměrování

Třída HttpURLConnection umí zpracovat i přesměrování. Může se však stát, že přesměrování potřebujeme vypnout. K tomu slouží statická metoda HttpURLConnec­tion.setFollow­Redirects(boo­lean set). Pokud je hodnota parametru set false, přesměrování neproběhne.

Čtení hlaviček

Pro čtení HTTP hlaviček odpovědi slouží tyto metody třídy URLConnection:

  • String getHeaderFiel­dKey(int n)  – Vrátí jméno n-té hlavičky.
  • String getHeaderFiel­d(String name) – Vrátí hodnotu hlavičky pojmenované name.
  • String getHeaderField(int n) – Vrátí hodnotu n-té hlavičky.
  • int getHeaderFiel­dInt(String name, int Default) – Vrátí hodnotu hlavičky pojmenované name jako datum. Datum je určeno počtem milisekund od 1. ledna roku 1970. Jestliže hlavička chybí nebo její hodnotu nelze načíst, bude vrácena Default.
  • int getHeaderFiel­dInt(String name, int Default) – Vrátí celočíselnou hodnotu hlavičky name. Opět jako v předchozím případě platí, že pokud hodnotu nelze získat, je vrácen parametr Default.
  • Map<String,Lis­t<String>> getHeaderFields() – Vrátí všechny hlavičky jako mapu. Klíči jsou názvy hlaviček, jako prvky jsou uloženy seznamy všech jejich hodnot.

Čtení obsahu odpovědi

K přečtení odpovědi slouží metoda getInputStream() třídy URLConnection. Do tohoto vstupního proudu je postupně odesílána odpověď. Jakmile jsou všechna data přečtena, proud se ukončí.

Příklad HTTP spojení

Tento jednoduchý příklad načte úvodní stránku Rootu a vypíše ji na konzoli. Může vyvolat výjimky java.net.Malfor­medURLExcepti­on nebo java.io.IOExcep­tion.

URL url = new URL("http://www.root.cz");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));
String s;
while((s = reader.readLine()) != null) {
    System.out.println(s);
}
reader.close(); 

Další příklad vypíše všechny hlavičky i s jejich hodnotami:

URL url = new URL("http://www.root.cz");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
Map<String,List<String>> headers = http.getHeaderFields();
for(String key: headers.keySet()) {
    for(String value: headers.get(key)) {
        System.out.println(key + ": " + value);
    }
} 

Na této ukázce si lze povšimnout zajímavé věci: hlavičky „null: HTTP/1.1 200 OK“. V žádném případě se najedná o hlavičku, nýbrž o první řádek odpovědi udávající výsledek HTTP požadavku.

Znakové sady pomocí java.nio.char­set.Charset

Balík java.nio.charset má na starosti znakové sady v New I/O. Umožňuje převádět obsah bajtových bufferů na řetězce a naopak vytvářet ze znakových bufferů bajtové. Nyní si popíšeme jednu z jeho pěti tříd – třídu Charset představující znakovou sadu.

java.nio.char­set.Charset

Třída Charset reprezentuje znakovou sadu. K získání její instance a tedy i znakové sady je možno použít tyto dvě statické tovární metody:

  • static Charset defaultCharset() – Vrátí výchozí znakovou sadu.
  • static Charset forName(String charsetName) – Vytvoří znakovou sadu podle zadaného názvu.

Třetí možností, jak objekt typu Charset získat, je metoda static SortedMap<Strin­g,Charset> availableChar­sets(). Ta vrátí mapu obsahující všechny dostupné znakové sady. Jako klíče jsou použity jejich názvy.

Pokud potřebujeme zjistit, zda je určitá znaková sada podporovaná, použijeme metodu static boolean isSupported(String charsetName).

Nyní se pojďme podívat na užitečné metody poskytované třídou Charset:

  • Set<String> aliases() – Vrátí seznam (resp. množinu) všech aliasů této znakové sady.
  • CharBuffer decode(ByteBuffer bb) – Převede obsah zadaného bajtového bufferu na znakový buffer.
  • ByteBuffer encode(CharBuffer cb) – Vrátí nový bajtový buffer obsahující znaky ze zadaného znakového bufferu.
  • ByteBuffer encode(String str) – Vrátí nový bajtový buffer obsahující zadaný řetězec.
  • CharsetDecoder newDecoder() – Vytvoří nový dekodér této znakové sady.
  • CharsetDecoder newEncoder() – Vytvoří kodér pro znakovou sadu.

Pokud máte zájem dozvědět se více o (de)kodérech, nahlédněte do dokumentace tříd CharsetDecoder a CharsetEncoder.

Příklad práce se znakovými sadami

Následující příklad ukazuje, jak lze pracovat s třídou Charset. Jako parametr konzole zadáme znakovou sadu a program vypíše všechny její aliasy (ostatní názvy). Pokud parametr nezadáme nebo znaková sada neexistuje, aplikace upozorní příslušným chybovým hlášením a vytiskne na konzoli seznam dostupných kódování.

import java.nio.charset.*;
import java.util.*;

public class CharsetAliases {

    public static void main(String[] args) {
        if(args.length < 1) {
            System.out.println("Použití: java CharsetAliases znaková_sada");
            available();
            return;
        }

        String charsetName = args[0];

        if(!Charset.isSupported(charsetName)) {
            System.out.println("Nepodporovaná znaková sada: " + charsetName);
            available();
            return;
        }

        Charset charset = Charset.forName(charsetName);
        Set<String> aliases = charset.aliases();
        System.out.println("Aliasy znakové sady " + charsetName + ":");
        for(String alias: aliases) {
            System.out.println(alias);
        }
        System.out.println("Celkem aliasů: " + aliases.size());
    }

    private static void available() {
        System.out.println("\nDostupné znakové sady:");
        Map<String,Charset> charsets = Charset.availableCharsets();
        for(String name: charsets.keySet()) {
            System.out.println(name);
        }
        System.out.println("Celkem znakových sad: " + charsets.keySet().size());
    }

} 

Závěr

Dnes jsme se dostali až na konec celého osmidílného seriálu. Ukázali jsme si, jakým způsobem získat seznam síťových rozhraní, jednoduchou práci s HTTP protokolem a základ znakových sad v balíku java.nio.charset.

Nyní mi už zbývá jen popřát vám hodně úspěchů při síťování i jiném programování v Javě. Zroveň věřím, že se vám seriál líbil a měl pro vás nějaký přínos. Pokud budete mít někdy k síťování v Javě jakékoliv dotazy, můžete se obrátit na email wantox@gmail.com, ochotně vám odpovím.

Našli jste v článku chybu?

10. 6. 2006 9:43

dd (neregistrovaný)
Podle mne je normalni zkusit nazev prelozit do jazyka ve kterem se tento termin pouziva, to bychom za chvili mluvili jenom anglicky, navic to zni otresne kdyz mluvis cesky a najednou do toho vlozis zkomolene nejaky anglicky termin. Myslis si, ze by anglicani mezi sebou pouzivali neupraveny cizi vyraz? Silne o tom pochybuji.

8. 6. 2006 22:22

Cavity (neregistrovaný)
V tyhle knizce je hodne novot. Tak treba "jedinacek" a kupa dalsich ;-).
Ten prekladatel byl hodne sjetej, kdyz to prekladal ;-)
Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

DigiZone.cz: Je tu první sportovní přenos přes mobily

Je tu první sportovní přenos přes mobily

Podnikatel.cz: V restauraci bez cigaret? Sněmovna kývla

V restauraci bez cigaret? Sněmovna kývla

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí