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:

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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):

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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&aacute;ci&oacute;
<ul>
<li><a href="informatika_java_programozas_modositas.html">

Legut&oacute;bbi m&oacute;dos&iacute;t&aacute;sok, h&iacute;rek</a></li>
stb.