Første
Java i netværk serie, Planche nr. 33
Kursus Indhold

Udskrift af : Java i netværk

Planche 1 : Java i netværk

Java er netværksorienteret

Planche 2 : Applet

Applets implementerer en række netværkforbindelser

Hvilke muligheder findes

Planche 3 : APPLET-tag

(fra Java Intro)
Appearance: <APPLET CODE=string HEIGHT=n WIDTH=n> </APPLET>
Attributes: CODEBASE=URL, CODE=string, NAME=string, ALT=string, ALIGN=left|right|top|middle|bottom, HEIGHT=n, WIDTH=n, HSPACE=n, VSPACE=n
Bemærk CODEBASE parameter!

CODEBASE er en URL, der kan være forskellig fra den URL, hvor HTML-siden (med APPLET-tag) hentes fra.

Planche 4 : Parametre til Applets

Mellem <APPLET ...> og </APPLET> kan man angiver parametre til Applet i HTML:
<PARAM NAME="paramnavn" VALUE="paramværdi">
Inde i en applet kan man kalde metoden
  String st = this.getParameter("paramnavn")
Derefter vil String-objektet udpeget af st indeholde "paramværdi"

Planche 5 : Billeder

gif-filer og jepg-filer kan læses direkte via URL fra en applet.

Applet klassen har to getImage() metoder:

OBS! Only applets can use the Applet getImage() methods. Moreover, the Applet getImage() methods don't work until the applet has a full context (AppletContext). For this reason, these methods do not work if called in a constructor or in a statement that declares an instance variable. You should instead call getImage() from a method such as init().

Planche 6 : Billeder - toolkit

Hvis man ønsker at anvende getImage() uden for en appletklasse, kan man forsøge sig med en Toolkit-klasse:

OBS! You can get a Toolkit object either by invoking Toolkit's getDefaultToolkit() class method or by invoking the Component getToolkit() instance method. The Component getToolkit() method returns the toolkit that was used (or will be used) to implement the Component.

Planche 7 : Netværk til husbehov

Planche 8 : Netværk i Java

Javaprogrammer har adgang til nettet via java.net-pakken.

Planche 9 : URL

Planche 10 : URL-adresse

Uniform Resource Language

    PROTOKOL://HOSTNAME:PORTNR/FILNAVN#REFERENCE
Hvor
PROTOKOL Protokolbetegnelse: http, ftp, file ...
HOSTNAME Internet navn eller IP-adresse på maskinen, hvor resourcen findes.
FILNAVN Filnavn og -sti (Kan indeholde /).
PORTNR Portnummer (udelades ofte).
REFERENCE En reference inden for en fil (e.l).

Planche 11 : Opret URL-objekt

Hvis man har en komplet URL, kan man oprette et URL-objekt med:
	URL urlobj = new URL("http://www.blanet.dk/");

URL-konstruktør

	URL (String fuldURL);
Man kan oprette en relativ URL med et andet URL-objekt
	URL relobj = new URL(urlobj, "index.html");

Generel URL-konstruktør

	URL (URL baseobj, String relnavn);
Andre konstruktører:
	URL (String protokol, String hostnavn, String filnavn);

	URL (String protokol, String hostnavn, int portnr, String filnavn); 

Planche 12 : URL kan give undtagelse

URL kan oprette en undtaglse: MalformedURLException.

Beskyt koden med try og catch:

try {
    URL myURL = new URL(. . .)
} catch (MalformedURLException e) {
    . . .
    // Kode til undtagelseshåndtering
    . . .
}

Planche 13 : Metoder på URL-objekt

URL-objektet kan fortolke URL'en.

import java.net.*;
import java.io.*;

public class ParseURL {
    public static void main(String[] args) throws Exception {
        URL aURL = new URL("http://www.blanet.dk:80/kursus/java/links.html#udpak");
        System.out.println("protocol = " + aURL.getProtocol());
        System.out.println("host = " + aURL.getHost());
        System.out.println("filename = " + aURL.getFile());
        System.out.println("port = " + aURL.getPort());
        System.out.println("ref = " + aURL.getRef());
    }
}

Planche 14 : Læs fil fra server (Øvelse 6)

URL kan bruges direkte til at læse tekst fra en server:

public class URLlaeser {
    public static void main(String[] args) throws Exception {
        ...
        URL blanet = new URL(hostURL);
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                blanet.openStream()));

        String inputLine;

        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);

        in.close();
    }
}

Opgave

Planche 15 : Proxy

Hvis man sidder på et intranet, kan det være man skal forbinde sig via en proxy. Se i browser-opsætning om det er nødvendigt.

Hvis proxyadressen er 192.66.116.254 og proxyport 8080, så kan man køre via proxy:

java -Dhttp.proxyHost=192.66.116.254 -Dhttp.proxyPort=8080 URLlaeser

Planche 16 : Åben URL-forbindelse

Når et URL-objekt er oprettet, kan det bruges til at oprette en forbindelse med.

try {
    URL blanet = new URL("http://www.blanet.dk/");
    URLConnection uc = blanet.openConnection();
} catch (MalformedURLException e) {     // new URL() failed
    . . .
} catch (IOException e) {               // openConnection() failed
    . . .
}
Metoden returnere et objekt at typen URLconnection - et forbindelsesobjekt

Husk at fange undtagelserne...

Planche 17 : Læs og skriv til URL

Man kan læse fra URL-forbindelser
import java.net.*;
import java.io.*;

public class URLConnectionReader {
    public static void main(String[] args) throws Exception {
        URL blanet = new URL("http://www.blanet.dk/");
        URLConnection bc = blanet.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                bc.getInputStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null) 
            System.out.println(inputLine);
        in.close();
    }
}
Fremhævelse viser forskel fra direkte læsning fra URL.

Planche 18 : Skrive til URL (Opgave)

Man kan skrive til URL-forbindelser

HVIS URL'en kan modtage

import java.io.*;
import java.net.*;

public class Reverse {
    public static void main(String[] args) throws Exception {

        if (args.length != 1) {
            System.err.println("Usage:  java Reverse string_to_reverse");
            System.exit(1);
        }

        String stringToReverse = URLEncoder.encode(args[0]);

        URL url = new URL("http://Andante:8080/examples/servlet/Baglaens");
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);

        PrintWriter out = new PrintWriter(connection.getOutputStream());
        out.println("string=" + stringToReverse);
        out.close();

        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                connection.getInputStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);

        in.close();
    }
}

Planche 19 : Sockets!

Planche 20 : Socket-definition

Socket: Et endpunkt i en tovejsforbindelse mellem to programmer - måske - over et netværk.

Endepunktet er bundet til et portnummer i en TCP-forbindelse.

Forbindelsen er platformsuafhængig.

Planche 21 : Java sockets

JDK pakken java.net indeholder to klasser:

Planche 22 : Socket IO

Her er et eksempel, der bruger socket-io:
import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            echoSocket = new Socket("taranis", 7);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;

        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
        }

        out.close();
        in.close();
        stdIn.close();
        echoSocket.close();
    }
}
Det gennemgås efterfølgende.

Bemærk - servicen ECHO (port 7) er nu efterhånden lukket på grund af hensyn til sikkerhed på internettet.

Planche 23 : Gennemgang - 1

Linierne:
echoSocket = new Socket("taranis", 7); // (1)
out = new PrintWriter(echoSocket.getOutputStream(), true); // (2)
in = new BufferedReader(new InputStreamReader(
                             echoSocket.getInputStream())); // (3)
(1) Åbner en socket-forbindelse til port 7 på maskinen "taranis".

(2) Tager uddata-delen fra socket-forbindelsen og lader den læse fra PrintWriter.

(3) Tager inddata-delen og forbinder den til programmets inddatastrøm

(2) er data TIL serveren, (3) data FRA serveren...

Planche 24 : Gennemgang - 2

Linierne:
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;

while ((userInput = stdIn.readLine()) != null) {
    out.println(userInput);
    System.out.println("echo: " + in.readLine());
}
Denne while-struktur læser fra konsol (stdIn) indtil brugeren trykker end-of-input-tegn (CTRL/C). Samtidig læser sidste linie fra socket-forbindelsen og skriver ekko-linien ud.

Planche 25 : Gennemgang - 3

Linierne:
out.close();
in.close();
stdIn.close();
echoSocket.close();
Lukker forbindelserne ned på en pæn måde.

Planche 26 : Socket OI - resume

  1. Åben en socket-forbindelse.
  2. Åben en inputstrøm og en outputstrøm til forbindelsen.
  3. Læs og skriv fra strømmen, sådan som "serveren" ønsker det
  4. Luk de to strømme.
  5. Luk socket-forbindelsen.
Kun punkt 3 er forskellige i forskellige anvendelser.

Planche 27 : Server

Velkommen til Client/Server teknologien!

Planche 28 : En Server (1)

En server skal lytte på en bestemt port:
try {
    serverSocket = new ServerSocket(4444);
} catch (IOException e) {
    System.out.println("Could not listen on port: 4444");
    System.exit(-1);
}
I dette tilfælde er det port 4444

Planche 29 : En Server (2)

Hvis porten er ledig:
Socket clientSocket = null;
try {
    clientSocket = serverSocket.accept();
} catch (IOException e) {
    System.out.println("Accept failed: 4444");
    System.exit(-1);
}
accept-metoden returnerer et Socket-objekt, når en klient forbinder sig...

Planche 30 : En Server (3)

Input- og outputstrømme etableres:
PrintWriter out = new PrintWriter(
                      clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
                        new  InputStreamReader(
                        clientSocket.getInputStream())),
String inputLine, outputLine;

while ((inputLine = in.readLine()) != null) {   
    //
    // Gør noget fornuftigt - her kopieres bare
    //
    outputLine = inputLine;
    out.println(outputLine);
    if (outputLine.equals("Bye."))
        break;
}

Planche 31 : En server (4)

Oprydning:
out.close();
in.close();
clientSocket.close();
serverSocket.close();

Planche 32 : Vores tur! (Opgave)

En client server-opgave... Implementer ECHO-service:

Planche 33 : En rigtig server?

Ovennævnte server kan kun håndtere en forbindelse af gangen.

For at håndtere flere, må vi bruge tråde...

Selvstudium! - Eller kig i Forslags-forlderen (MultiServer)


© 2000 BLA*net - Leif E. Andersen, leander@blanet.dk
Første
Java i netværk serie, Planche nr. 33