Gyakorlati alapok III.
Hálózati csatlakozási módok
Az előző fejezetekben tisztáztuk a hálózattal kapcsolatos legfontosabb alapfogalmakat, illetve az URL fogalmát. Ebben a fejezetben Java-hálózati rutinok segítségével konkrétan rá fogunk csatlakozni HTML-honlapokra, hogy róluk információkat szerezhessünk.
Első lépésként hozzunk létre egy URL-objektumot, hiszen ez reprezentálja
az Interneten elérhető erőforrásokat. Ezután az előző fejezetben leírtak
szerint tegyük try-catch blokkba a műveleti kódot, hogy a keletkező
lehetséges hibákat elkaphassuk és lekezeljük (Kivételkezelés
című fejezetcsomag). Itt azonban már 2 hibát előre is láthatunk:
-
rossz URL-formátum,
-
sikertelen hálózati csatlakozás.
Először még ne törődjünk a hiba típusával, azaz legyen csak 1 db try-catch blokk. Kíséreljük meg a hálózati csatlakozást egy, garantáltan létező HTML-oldalra és amíg csak találunk rajta tartalmat, töltsük le, valamint jelenítsük meg a konzolon. Ehhez nagyon kényelmesen tudjuk felhasználni az egyik, az URL-objektumhoz tartozó metódust (openStream()), hiszen használatának jellege rendkívül hasonló a Bemenet - kimenet (fájlkezelés) című fejezetcsomagban leírt fájlkezeléshez:
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
URL url = new
URL("http://www.informatika-programozas.hu/index.html");
BufferedReader in = new BufferedReader(new
InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception e) {
System.out.println("Rossz URL, rossz
hálózati csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin
template="/Templates/main.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"
/>
<!-- InstanceBeginEditable name="doctitle" -->
<title>www.informatika-programozas.hu - Index</title>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable -->
<link href="styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="banner.js" ></script>
<script type="text/javascript" src="js/simpletreemenu.js">
stb.
Természetesen az erőforrás címét kitehetjük egy különálló, String típusú objektumba (itt String urlResource):
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
String urlResource =
"http://www.informatika-programozas.hu/index.html";
URL url = new
URL(urlResource);
BufferedReader in = new BufferedReader(new
InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception e) {
System.out.println("Rossz URL, rossz
hálózati csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin
template="/Templates/main.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"
/>
<!-- InstanceBeginEditable name="doctitle" -->
<title>www.informatika-programozas.hu - Index</title>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable -->
<link href="styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="banner.js" ></script>
<script type="text/javascript" src="js/simpletreemenu.js">
stb.
A következő kódban már tegyünk különbséget a hibákban. Ezt úgy tudjuk megoldani, hogy 2 catch águnk lesz, az első tartalmazza a specifikusabb, a második pedig az általánosabb hibakezelést:
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
URL url = new
URL("http://www.informatika-programozas.hu/index.html");
BufferedReader in = new
BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) !=
null)
System.out.println(inputLine);
in.close();
} catch (MalformedURLException mfue) {
System.out.println("Rossz URL!");
} catch (Exception e) {
System.out.println("Rossz hálózati
csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin
template="/Templates/main.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"
/>
<!-- InstanceBeginEditable name="doctitle" -->
<title>www.informatika-programozas.hu - Index</title>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable -->
<link href="styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="banner.js" ></script>
<script type="text/javascript" src="js/simpletreemenu.js">
stb.
A hálózati csatlakozás megoldható egy másik, szintén beépített metódussal is, ez pedig az openConnection(). Előnye az előző, openStream() metódushoz képest, hogy nemcsak egyszeri, bejövő adatfolyamot kap, hanem valós idejű, alapjában véve kétirányú kapcsolatot épít ki a szerver felé, ezért éppúgy felhasználható írásra, mint olvasásra (például űrlapok kitöltésekor), akár egyidőben:
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
URL url = new
URL("http://www.informatika-programozas.hu/index.html");
URLConnection urlConnection = url.openConnection();
BufferedReader in = new BufferedReader(new
InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (MalformedURLException mfue) {
System.out.println("Rossz URL!");
} catch (Exception e) {
System.out.println("Rossz hálózati
csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin
template="/Templates/main.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"
/>
<!-- InstanceBeginEditable name="doctitle" -->
<title>www.informatika-programozas.hu - Index</title>
<!-- InstanceEndEditable -->
<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable -->
<link href="styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="banner.js" ></script>
<script type="text/javascript" src="js/simpletreemenu.js">
stb.
Most pedig konspiráljunk egy kicsit!
Elrejtettem a kezdőoldalamon egy szöveget. A szöveg a <!--<!-- karakterszekvenciával kezdődik. A HTML-ben jártas olvasók tudják, hogy ez valójában egy belső kommentjegyzet része (<!-- szöveg -->), amelyet a szöveg bár tartalmazni fog, ám a kliens-oldalon a böngésző mégsem jelenít meg. A cél csakis a szekvencia utáni szöveg kiírása legyen. Ekkor csakis arra a sorra vagyunk kíváncsiak, amely ezzel a karakterszekvenciával kezdődik, tehát:
if(inputLine.contains("<!--<!--")) System.out.println(inputLine);
Nézzük meg a futtatható Java-kódot:
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
URL url = new
URL("http://www.informatika-programozas.hu/index.html");
URLConnection urlConnection = url.openConnection();
BufferedReader in = new BufferedReader(new
InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
if(inputLine.contains("<!--<!--"))
System.out.println(inputLine);
in.close();
} catch (MalformedURLException mfue) {
System.out.println("Rossz URL!");
} catch (Exception e) {
System.out.println("Rossz hálózati
csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<!--<!--Ha ezt le tudtad szedni az oldalról, akkor veszett ügyes vagy!-->
Utolsó gondolatként jegyezzük meg, hogy bármelyik fent ismertetett hálózati rutinról is legyen szó, ám mindegyikük képes más jellegű szöveges állomány elérésére is (ennek teljes spektruma a jelen honlap keretein belül még nem tisztázott). Például az alábbi szöveges tartalom menu.php néven szintén honlapomon, értsd: közvetlenül a domain név alatt érhető el, amely valójában egy futtatható PHP-kód, feladata pedig a honlap bal oldalán lévő menürendszer felépítése:
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
String urlResource =
"http://www.informatika-programozas.hu/menu.php";
URL url = new
URL(urlResource);
BufferedReader in = new BufferedReader(new
InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception e) {
System.out.println("Rossz URL, rossz
hálózati csatlakozás vagy nincs hálózat!");
}
}
}
Végeredmény:
<ul id="treemenu" class="treeview">
<li>Adminisztráció
<ul>
<li><a href="informatika_java_programozas_modositas.html">
Legutóbbi módosítások,
hírek</a></li>
stb.