Síťové API Javy - balík java.net

Služby pro síťovou komunikaci jsou součástí Javy od jejich prvních verzí. Třídy pro tvorbu síťových aplikací jsou umístěny v balíku java.net. V současné době je podporována komunikace v prostředí intranet/internet na bázi rodiny protokolů TCP/IP.

Mimo prostředků na spojově orientovanou a datagramovou komunikaci poskytuje balík možnosti komunikace typu multicast, včetně metod pro připojování a odpojování se k jednotlivým multicast skupinám.

Kromě nízkoúrovňové komunikace založené na obvyklém API používajícím socketů je k dispozici řada služeb zpřístupňující obsah síťových zdrojů na základě jejich identifikace pomocí URL (Uniform Resource Locator). Mechanismus získávání obsahu z jednotlivých typů URL je uživatelsky modifikovatelný, lze doprogramovat ovladače pro přístup k libovolné službě a pro zpracování libovolného typu obsahu (contents type).

Aplikace mohou být snadno modifikovány pro provoz ve speciálních síťových podmínkách (přítomnost firewallů, proxy serverů, překlad adres) díky možnosti zaregistrování vlastní implementace soketů (zvlášť pro sockety použité pro příjem spojení (server) a pro sockety využívané v prostředí klienta). Tím je možné vytvořit transparentní mezivrstvu, provádějící příslušné překlady adres pro dané prostředí, poskytující např. autentikační informace (třeba pro SOCKS server) nebo realizující šifrování či překódovávání přenášených dat.

URL: Uniform Resource Locator

URL mohou být zadány absolutně nebo relativně vzhledem k síťovému zdroji, ve kterém se vyskytují.

Třídy a rozhraní balíku java.net

URL

Při vytváření první instance URL pro daný protokol se vytvoří instance ovladače (třídy URLStreamHandler) pro tento protokol.

Byla-li předem nastavena instance URLStreamHandlerFactory, získá se instance ovladače pro daný protokol voláním metody createURLStreamHandler(protokol) nad instancí stream handler factory.
Jinak systém ovladač vytváří jako instanci třídy s názvem < package > .< protoco > .Handler , kterou hledá v některém z balíků specifikovaných systémovou vlastností java.protocol.handler.pkgs .
Pokud se vhodná třída nenajde, zkouší se v balíku sun.net.www.protocol.< protocol >.Handler , při selhání se vyhodí výjimka MalformedURLException.

Poznámka: Patřičnou instanci URLStreamHandler lze také explicitně zadat při vytváření URL (pokud to security manager dovolí)

Poznámka: URLStreamHandler může modifikovat části URL prostřednictvím (protected) metody URL.set(String protocol, String host, int port, String file, String ref).

URLConnection

Podtřídy třídy URLConnection, které jsou součástí JDK

HttpURLConnection

JarURLConnection

Vazba ovladačů služeb (stream handlers) a ovladačů obsahu (content handlers) na systém

Aktivní URLStreamHandler umí otevřít spojení pro příslušný protokol a vrátit instanci odpovídající podtřídy URLConnection pro tento protokol (metoda URLConnection openConnection(URL u)).

Aktivní URLStreamHandlerFactory vrací instanci URLStreamHandler na základě protokolu. ContentHandlerFactory vrací instanci ContentHandler na základě MIME typu. ContentHandler má jedinou metodu Object getContent(URLConnection urlc)

InetAddress

Socket

class Socket { 
 Socket(InetAddress address, int port);
 Socket(String host, int port, InetAddress localAddr, int localPort);
 /* konstruktory prověřují právo vytvořit socket u security manageru *./

 getInetAddress(); 
 getPort();
  /* vrátí adresu, resp. port protistanice, na kterou je socket připojen */

 getLocalAddress();
 getLocalPort();
  /* vrátí lokálně použitou adresu, resp. port */

 getInputStream();
 getOutputStream();
  /* vrátí vstupní, resp. výstupní stream použitelný pro čtení, resp. zápis 
     dat na socketu  */
 
 setTcpNoDelay();
  /* zákaz/povolení Nagleho algoritmu (s vysláním TCP segmentu se čeká 
     na příchod prahového množství dat) */
 setSoLinger();
  /* nastavení maximální doby čekání na odeslání zbývajících dat 
     při ukončování spojení */
 setSoTimeout();
  /* nastavení časového limitu pro blokující operaci čtení */

 close();
  /* rozpojení spojení a uzavření socketu */

 setSocketImplFactory()
  /* nastavení socket factory pro klientské sockety
     (pokud to security manager dovolí) */
}

ServerSocket

class ServerSocket {
 ServerSocket(int port, int backlog, InetAddress bindAddr)
  /* při konstrukci se dotazuje security manager, zda je poslouchání 
     na daném portu povoleno */

 Socket accept();
  /* čeká na spojení a po jeho navázání vrátí nový socket reprezentující 
     nové spojení.  Při akceptování nového spojení je vyvolán security 
     manager s adresou a číslem portu klienta, ten musí spojení dovolit */

 getInetAddress();
 getLocalAddress()
  /* vrátí (lokální) adresu a port, na které se čeká na požadavky spojení */

 setSoTimeout()
  /* nastavení časového limitu pro čekání na spojení accept() */

 implAccept(socket)
  /* pomocná metoda pro redefinici accept() v podtřídách, aby se vracela 
     vhodná podtřída Socket */
 close();
  /* rozpojení spojení a uzavření socketu */

 static setSocketImplFactory() 
  /* nastavení socket factory pro serverové sockety (pokud to 
     security manager dovolí) */
}

DatagramSocket

class DatagramSocket { 
 DatagramSocket(int port, InetAddress laddr);
  /* security manager musí komunikaci na daném portu povolit */
 getInetAddress(),
 getPort();
  /* zjištění adresy protistanice, na kterou budou datagramy z tohoto
     socketu vysílány (pokud byl dříve s protistanicí socket svázán
     metodou connect()) */

  getLocalAddress();
  getLocalPort();
  /* vrací lokální adresu, resp. port přiřazený socketu */

 setSoTimeout();
  /* nastavení časového limitu pro blokující čekání na datagram 
     metodou receive() */

  connect(InetAddress address, int port);
  /* sváže socket s adresou protistanice, která se dále bude výhradně 
     užívat. Zde se prověřují práva na komunikaci se zadanou protistanicí 
     u security managera, při dalších operacích send() a receive() však již
     prověřována nebudou */

 disconnect(); 
 /* odváže socket od protistanice */

 send(DatagramPacket p);
  /* zaslání datagramu (paketu) na zadanou stanici. Součástí instance 
     DatagramPacket jsou jak uživatelská data, tak adresa a port 
     protistanice. Pokud není socket svázán s adresou protistanice metodou 
     connect(), ověřuje se, je-li spojení mezi lokální adresou a adresou 
     a portem protistanice povoleno */

 void receive(DatagramPacket p);
  /* čeká na příchod datagramu. Data i identifikaci odesílatele uloží
     do zadané instance DatagramPacket. Pokud je délka příchozího datagramu 
     větší než velikost předaného bufferu pro paket, je zpráva oříznuta.
     Security manager ověřuje právo přijetí datagramu ze zadané adresy 
     (stejné jako pro accept u serverového socketu) */

close();
 /* uzavření socketu */}
}

DatagramSocketImpl

Abstraktni bázová třída pro skutečné implementace datagramových a multicast socketů.
Základní implementaci v JDK poskytuje interní třída PlainDatagramSocketImpl.

MulticastSocket

Poznámky.
class MulticastSocket : DatagramSocket {
   MulticastSocket(int port);
   setTimeToLive();  /* nastavení maximálního počtu přeskoků  */
                     /* vysílaného multicast datagramu v síti */
   joinGroup();    /* připojení do multicastové skupiny */
   leaveGroup();   /* odpojení z multicastové skupiny */
}

DatagramPacket

URLEncoder, URLDecoder

Pomocné třídy s metodami pro převod řetězce na MIME formát "x-www-form-urlencoded"a zpět. Tento formát slouží pro předávání parametrů obsahujících nepísmenné znaky jako součást URL (např. předávání parametrů z formulářů metodou GET).

URLClassLoader

Zavaděč tříd schopný číst třídy specifikované sadou URL odkazujících se na adresáře na síti nebo JAR soubory

Podpora autentizace pro síťová spojení

Mechanismus pro poskytování autentizačních informací (mohou být pořadovány např. WWW serverem, firewallem, SOCKS serverem, ...)

Authenticator

PasswordAuthentication

Nosič dvojice < uživatelské_jméno, heslo > používaný instancí třídy Authenticator.