7. A hálózatkezelés osztályai
7.2.4 Internetes erőforrások elérése
Az internetes erőforrásokat különböző protokollokon keresztül lehet elér-ni. Ilyen protokoll pl. az FTP (File Transfer Protocol), és a HTTP (HyperText Transfer Protocol) is. Ezeket az erőforrásokat el lehet érni az egységes erőforrásazonosítókon (Uniform Resource Locator – URL) keresztül. Az URL nem csak fájlokra mutathat, hanem pl. adatbázis lekérdezesekre is. Az URL ma-gában foglalja:
a számítógép nevét, amelyen az erőforrás található
a protokollazonosítót, amelyen keresztül az erőforrás elérhető
az erőforrás azonosítására szolgáló részeket
Például a http://www.ektf.hu/index.php erőforrás URL-jéből látható, hogy a http-protokollon keresztül, a www.ektf.hu hoszton (számítógépen) hivatko-zunk az index.php fájlra. Javában az URL-ek kezelésére és műveletek végzésére az URL, URLConnection és HttpURLConnection osztályok használható-ak. Mindkét osztály alkalmas arra, hogy beolvassuk az URL tartalmát (vagyis amit kimenetként generál), de az URLConnection-nel az erőforrásnak jóval több jellemzőjéhez lehet hozzáférni és lehetőség van az erőforrás felé adatkül-désre (pl. HTTP POST).
Az URL osztály
Egy URL objektum lehetővé teszi egy hálózati erőforrás elérését. URL ob-jektum létrehozása a legegyszerűbben az őt leíró URL sztring segítségével tehe-tő meg. Pl.
1 URL u1=new URL("http://www.ektf.hu/index.php");
Az ilyen formában megadott URL-t abszolút URL-nek nevezzük. Létrehoz-hatunk URL-objektumokat relatív URL-ekkel is. Ilyenkor az egyik URL-objektumot használjuk fel arra, hogy egy másikat előállítsunk. Az első paramé-ter a bázis URL (vagy alap URL), a második egy sztring, amely a bázison belüli erőforrásra hivatkozik.
1 URL ekf=new URL("http://www.ektf.hu");
2 URL startPage=new URL(ekf,"index.php");
Amennyiben nem ismerjük a teljes URL-t, csak az összetevőit, akkor hasz-nálhatjuk még ezt a fajta megadási módot is, ahol első paraméter a protokoll, majd a hoszt, portszám és az erőforrás elérési útja.
1 URL ekf=new
URL("http","www.ektf.hu",80,"index.php");
Az URL-objektumok komponenseit lekérdezhetjük a következő metódu-sokkal:
String getProtocol(): az URL protokoll komponense
String getHost(): az URL hoszt komponense
int getPort(): az URL portja, -1-et ad, ha a port nincs beállítva
String getFile(): az URL fájlneve
String getRef(): az URL horgonya (pl. index.html#top esetén a top)
A boolean sameFile(URL u) metódus true-t ad vissza, ha az ak-tuális és a paraméterben megadott URL ugyanazt az erőforrást azonosítja.
Az URL-lel megadott erőforráshoz többféleképpen férhetünk hozzá:
Object getContent(): többnyire egy InputStream folyamot ad vissza (Object típusként), amelyen keresztül hozzáférhetünk az URL tartalmához
InputStream openStream(): egy InputStream-et ad vissza, amellyel kiolvasható az URL tartalma
URLConnection openConnection(): egy URLConnection-t ad vissza, amellyel hozzáférhetünk az erőforrás jellemzőihez is
Nézzük meg a gyakorlatban, hogy tudjuk egy URL tartalmát kiolvasni. Az URL openStream metódusát fogjuk használni, és egy InputStreamReader-t közbeiktatva egy BufferedReader objektumon keresztül soronként fogjuk olvasni azt és fájlba írni:
1 URL ekf=new URL("http://java.sun.com");
2 BufferedReader input=new BufferedReader(new InputStreamReader(ekf.openStream()));
3 FileWriter output=new FileWriter("java.html");
4 String line;
5 while ((line=input.readLine())!=null) { 6 output.write(line);
7 }
8 output.close();
9 input.close();
Az URLConnection osztály
Az URLConnection osztály több lehetőséget biztosít, mint az URL osz-tály. Amennyiben már van URL-objektumunk, akkor annak az openConnection metódusával hozhatunk létre az URL-re vonatkozó URLConnection objektumot. Az URL-lel azonosított erőforrás tartalmához 3-féleképpen férhetünk hozzá:
Object getContent(): az URL tartalmát adja vissza
InputStream getInputStream(): egy InputStream-et ad vissza, amelyen keresztül olvashatjuk az URL tartalmát
OutputStream getOutputStream(): egy OutputStream-en keresztül írhatunk az URL tartalmára (pl. HTML űrlapok esetén)
A következő példában FTP-n keresztül töltünk le egy állományt:
1 URL local=new URL("ftp://localhost/eloadas.pptx");
2 FileOutputStream output=new FileOutputStream(local. getFile());
3 URLConnection conn=local.openConnection();
4 InputStream input=conn.getInputStream();
5 byte[] buffer=new byte[1024];
6 int bytesRead;
7 while ((bytesRead=input.read(buffer))!=-1) { 8 output.write(buffer,0,bytesRead);
9 }
10 output.close();
11 input.close();
Az URLConnection objektum esetén a következő hasznos metódusok állnak rendelkezésre, ezek főként HTTP URL-ek esetén hasznosak, mivel http-fejléc alapján működnek:
String getContentEncoding(): az erőforrás karakterkészletét adja vissza
String getContentLength(): az erőforrás méretét adja vissza
String getContentType(): az erőforrás típusát adja vissza
long getDate(): az erőforrás letöltésének dátuma
long getLastModified(): az erőforrás utolsó módosításának dátuma
String getHeaderField(String field): az argumentum-ban megadott (field) http fejléc értékét adja vissza
void setDoOutput(boolean b): true-t megadva jelezzük, hogy írásra is használjuk az URLConnection objektumot
void setUseCaches(boolean b): true-t megadva az URL talmát gyorsítótárazza, így újraletöltés esetén a cache-ből kapjuk a tar-talmát
Nézzük meg a már jól ismert prímtényezős felbontásos példánkat olyan módon, hogy a felbontandó számot egy PHP szkriptnek fogjuk elküldeni HTTP POST segítségével, majd a szkript előállítja a felbontást, és ezt fogja a progra-munk visszaolvasni. A Java kód a következő:
1 URL url=new
URL("http://localhost/java/index.php");
2 URLConnection conn=url.openConnection();
3 conn.setDoOutput(true);
4 OutputStreamWriter output=new
OutputStreamWriter(conn.getOutputStream());
5 output.write("value=12");
6 output.close();
7 BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
8 String line;
9 while ((line = input.readLine()) != null) { 10 System.out.println(line);
11 }
12 input.close();
A PHP kód pedig így néz ki:
1 function primeResolution($value) { 2 $i=2;
3 $result='';
4 while ($value!=1) {
5 while ($value % $i==0) { 6 $result.=$i.' ';
7 $value/=$i;
8 } 9 $i++;
10 }
11 return $result;
12 }
13 if (isset($_POST['value'])) {
14 echo primeResolution($_POST['value']);
15 }else{
16 echo 'hibas formatum';
17 }
7.3 ÖNELLENŐRZŐ KÉRDÉSEK
1. Jellemezze az összeköttetés-alapú és összeköttetés-mentes hálózato-kat, mondjon rá konkrét protokollmegvalósításokat!
2. Milyen osztályok állnak rendelkezésre Javában az előbbi két kommuni-káció megvalósítására?
3. Milyen lehetőségek vannak az internetes erőforrások elérésére?