Client/Server-Praktikum WS 2001/2002

Dozent: Spruth
Anfang
Aufgaben
Blatt 1
Blatt 2
Blatt 3
Blatt 4
Blatt 5
Blatt 6
Abgaben
Blatt 1
Blatt 2
Blatt 3
Blatt 4
Blatt 5
Blatt 6

Blatt 1


Aufgabe 1

  1. Die LDIF - Daten, werden mit dem Befehl: /usr/sbin/ldif2ldbm -f slapd.conf -i data.ldif eingespielt. Das Ergebnis ist die Generierung der Datenbankdateien.
    Der Befehl "time" liefert die Zeit, die dafür benötigt wird.
     
    quak seyrich/ldap2> ll
    total 209
    -rw-r--r--   1 seyrich  WSIstud    211380 Nov  7 15:14 data.ldif
    -rw-r--r--   1 seyrich  WSIstud      1061 Nov  7 15:25 slapd.conf
    quak seyrich/ldap2> time /usr/sbin/ldif2ldbm -f slapd.conf -i data.ldif
    1.410u 0.150s 0:01.98 78.7%     0+0k 0+0io 1068pf+0w
    quak seyrich/ldap2> ll
    total 778
    -rw-r--r--   1 seyrich  WSIstud         5 Nov  7 15:27 NEXTID
    -rw-r--r--   1 seyrich  WSIstud    211380 Nov  7 15:14 data.ldif
    -rw-------   1 seyrich  WSIstud    110592 Nov  7 15:27 dn.dbb
    -rw-------   1 seyrich  WSIstud     98304 Nov  7 15:27 dn2id.dbb
    -rw-------   1 seyrich  WSIstud      7168 Nov  7 15:27 id2children.dbb
    -rw-------   1 seyrich  WSIstud    358400 Nov  7 15:27 id2entry.dbb
    -rw-------   1 seyrich  WSIstud      7168 Nov  7 15:27 objectclass.dbb
    -rw-r--r--   1 seyrich  WSIstud      1061 Nov  7 15:25 slapd.conf
    quak seyrich/ldap2> 
  2. Die Abfrage aller Hotels in Esslingen kann in zwei Varianten erfolgen. Dementsprechend erhält man unterschiedliche Ausgaben
     
    quak seyrich/ldap2> ldapsearch -v -b 'dc=uni-tuebingen, dc=de' 'l=esslingen' -p 1
    091
    ldap_init( <default>, 1091 )
    filter pattern: l=esslingen
    returning: ALL
    filter is: (l=esslingen)
    uid=179, dc=uni-tuebingen,dc=de
    objectclass=organizationalUnit
    uid=179
    ou=Esslingen 179
    telephonenumber=179 179 179
    postalcode=73733
    l=Esslingen
    streetadress=Mittelstr. 12
    owner=Fr. Schwenk
    1 matches
    quak seyrich/ldap2> ldapsearch -v -b 'dc=uni-tuebingen, dc=de' 'l=esslingen*' -p 
    1091
    ldap_init( <default>, 1091 )
    filter pattern: l=esslingen*
    returning: ALL
    filter is: (l=esslingen*)
    uid=179, dc=uni-tuebingen,dc=de
    objectclass=organizationalUnit
    uid=179
    ou=Esslingen 179
    telephonenumber=179 179 179
    postalcode=73733
    l=Esslingen
    streetadress=Mittelstr. 12
    owner=Fr. Schwenk

    uid=636, dc=uni-tuebingen,dc=de
    objectclass=organizationalUnit
    uid=636
    ou=Esslingen-Berkheim 636
    telephonenumber=636 636 636
    postalcode=73734
    l=Esslingen-Berkheim
    streetadress=Kastellstr. 1
    owner=Siegfried Koengeter
    2 matches
    quak seyrich/ldap2> 

Der Parameter -v sorgt für die Ausgabe der Suchparameter, ist aber nicht erforderlich.

Aufgabe 2

eine Beschreibung der Hotels soll nun mit ldapmodify hinzugefügt werden. Gefragt ist wieder nach der Zeit, auch hier abgegriffen mit dem Befehl "time".
 
quak seyrich/ldap2>  time ldapmodify -D 'cn=admin, dc=uni-tuebingen, dc=de' -f description.ldif -p 1091 -wsecret
modifying entry dc=uni-tuebingen, dc=de

modifying entry uid=1, dc=uni-tuebingen,dc=de

modifying entry uid=2, dc=uni-tuebingen,dc=de

...

modifying entry uid=995, dc=uni-tuebingen,dc=de

modifying entry uid=996, dc=uni-tuebingen,dc=de

modifying entry uid=997, dc=uni-tuebingen,dc=de

modifying entry uid=998, dc=uni-tuebingen,dc=de

modifying entry uid=999, dc=uni-tuebingen,dc=de

modifying entry uid=1000, dc=uni-tuebingen,dc=de

0.310u 0.240s 1:24.33 0.6%      0+0k 0+0io 151pf+0w
quak seyrich/ldap2> 

Aufgabe 3

  1. Das Rahmenprogramm, ist so vervollständigt, dass es alle Hotels ausgibt, welche ein Bad besitzen und eine 7'er PLZ haben.
    Der Befehl zum Compilieren lautet:
    quak seyrich/ldap2> gcc -o aufgabe3 aufgabe3.c -lldap -llber
  2. Die Ausgabe (komplett) und die gemessene Zeit:
    quak seyrich/ldap2> time ./aufgabe3
    connecting to ldap server ...
    bind ...
    search ...ready

    Output:
     dn: uid=29, dc=uni-tuebingen,dc=de
            attribute: objectclass / value: organizationalUnit
            attribute: uid / value: 29
            attribute: ou / value: Mindersdorf 29
            attribute: telephonenumber / value: 29 29 29
            attribute: postalcode / value: 78355
            attribute: l / value: Mindersdorf
            attribute: streetadress / value: Adlergasse 4
            attribute: owner / value: Fam. Beringer-Hoffmann
            attribute: description / value: Minibar, Restaurant, Sauna, Dusche/Bad/W
    C.

    dn: uid=52, dc=uni-tuebingen,dc=de
            attribute: objectclass / value: organizationalUnit
            attribute: uid / value: 52
            attribute: ou / value: Reichenau 52
            attribute: telephonenumber / value: 52 52 52
            attribute: postalcode / value: 78479
            attribute: l / value: Reichenau
            attribute: streetadress / value: Am Voegelisberg 13
            attribute: owner / value: Fr. Keller
            attribute: description / value: Schwimmbad, Minibar.
     

    ...
     

    dn: uid=994, dc=uni-tuebingen,dc=de
            attribute: objectclass / value: organizationalUnit
            attribute: uid / value: 994
            attribute: ou / value: Korntal-Muenchingen 994
            attribute: telephonenumber / value: 994 994 994
            attribute: postalcode / value: 70825
            attribute: l / value: Korntal-Muenchingen
            attribute: streetadress / value: Stuttgarter Str. 60
            attribute: owner / value: Beate Schmalzridt
            attribute: description / value: Restaurant, Tiefgarage, Schwimmbad, Inte
    rnet/Fax, Zentral, Minibar.

    dn: uid=996, dc=uni-tuebingen,dc=de
            attribute: objectclass / value: organizationalUnit
            attribute: uid / value: 996
            attribute: ou / value: Tuebingen 996
            attribute: telephonenumber / value: 996 996 996
            attribute: postalcode / value: 72076
            attribute: l / value: Tuebingen
            attribute: streetadress / value: Schwalbenweg 17
            attribute: owner / value: Inh. Heinz Vetter
            attribute: description / value: Restaurant, Sauna, Schwimmbad, Massage, 
    Internet/Fax.

    0.030u 0.040s 0:00.37 18.9%     0+0k 0+0io 132pf+0w
    quak seyrich/ldap2> 
     

Aufgabe 4

Jetzt ist es Zeit unseren "slapd" zu killen
quak seyrich/ldap2> /usr/libexec/openldap/slapd -f slapd.conf -p 1091 -d 2
slapd starting
slapd shutting down - waiting for 0 threads to terminate
slapd stopping
quak seyrich/ldap2> 
  3:46pm  up 62 days,  2:09,  7 users,  load average: 0.18, 0.20, 0.10
187 processes: 186 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:  1.5% user,  4.3% system,  0.0% nice, 94.1% idle
Mem:   323032K av,  316808K used,    6224K free,  146520K shrd,   71472K buff
Swap:  257000K av,    1444K used,  255556K free                  144928K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
27589 seyrich   14   0  1116 1116   788 R       0  6.0  0.3   0:03 top
24560 seyrich    0   0  1244 1244   776 S       0  0.0  0.3   0:00 tcsh
24584 seyrich    0   0  1240 1240   772 S       0  0.0  0.3   0:00 tcsh
26444 seyrich    0   0  2424 2424   872 S       0  0.0  0.7   0:00 slapd
26445 seyrich    0   0  2424 2424   872 S       0  0.0  0.7   0:00 slapd
26446 seyrich    0   0  2424 2424   872 S       0  0.0  0.7   0:00 slapd

--------------------------

  3:47pm  up 62 days,  2:10,  7 users,  load average: 0.30, 0.22, 0.12
184 processes: 183 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:  0.7% user,  6.7% system,  0.0% nice, 92.4% idle
Mem:   323032K av,  313760K used,    9272K free,  145656K shrd,   71480K buff
Swap:  257000K av,    1444K used,  255556K free                  142916K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
27590 seyrich   12   0  1116 1116   788 R       0  5.8  0.3   0:01 top
24560 seyrich    0   0  1244 1244   776 S       0  0.0  0.3   0:00 tcsh
24584 seyrich    0   0  1240 1240   772 S       0  0.0  0.3   0:00 tcsh
 
 
 
 
 

quak seyrich/ldap2> exit
logout
Connection to quak closed.
ibm-xt[32] 

Blatt 2


  1. IDL-Datei vervollständigen

    Als erstes haben wir die Datei VierGewinnt.idl um die Interfaces der Objekte, die per CORBA im Netz bereitgestellt werden sollen ergänzt.
    Hernach haben wir sie mit dem Kommando idl2java VierGewinnt.idl -no_tie kompiliert:
    linus[45][~/corba1/Corba1 ] ll
    total 7
    drwxr-xr-x   2 seyrich  WSIstud      2048 Nov 23 16:31 ClientAufg1
    drwxr-xr-x   2 seyrich  WSIstud      2048 Nov 23 16:46 ServerAufg1
    -rw-r--r--   1 seyrich  WSIstud       690 Nov 26 15:13 VierGewinnt.idl
    -rw-r--r--   1 seyrich  WSIstud       521 Nov 26 15:12 vbroker.csh
    -rw-r--r--   1 seyrich  WSIstud       521 Nov  2  2000 vbroker.csh~
    linus[46][~/corba1/Corba1 ] idl2java VierGewinnt.idl -no_tie 
    Creating: VierGewinnt
    Creating: VierGewinnt/breite.java
    Creating: VierGewinnt/hoehe.java
    Creating: VierGewinnt/spielfeldTypHolder.java
    Creating: VierGewinnt/spielfeldTypHelper.java
    Creating: VierGewinnt/Partie4gewinnt.java
    Creating: VierGewinnt/Partie4gewinntHolder.java
    Creating: VierGewinnt/Partie4gewinntHelper.java
    Creating: VierGewinnt/_st_Partie4gewinnt.java
    Creating: VierGewinnt/_sk_Partie4gewinnt.java
    Creating: VierGewinnt/_Partie4gewinntImplBase.java
    Creating: VierGewinnt/_example_Partie4gewinnt.java
    Creating: VierGewinnt/PartieManager.java
    Creating: VierGewinnt/PartieManagerHolder.java
    Creating: VierGewinnt/PartieManagerHelper.java
    Creating: VierGewinnt/_st_PartieManager.java
    Creating: VierGewinnt/_sk_PartieManager.java
    Creating: VierGewinnt/_PartieManagerImplBase.java
    Creating: VierGewinnt/_example_PartieManager.java
    Creating: VierGewinnt/Meister.java
    Creating: VierGewinnt/MeisterHolder.java
    Creating: VierGewinnt/MeisterHelper.java
    Creating: VierGewinnt/_st_Meister.java
    Creating: VierGewinnt/_sk_Meister.java
    Creating: VierGewinnt/_MeisterImplBase.java
    Creating: VierGewinnt/_example_Meister.java
    linus[47][~/corba1/Corba1 ] 
  2. Server vervollständigen

    Aus der Datei Server.java machten wir ein funktionsfähiges Programm, das die in der Aufgabestellung erläuterten Aufgaben erledigt.
  3. Client vervollständigen

    In Client.java mussten die Methoden
    private static PartieManager holeManager()
    private static Meister holeMeister(int typ)
    vervollständigt werden.
    Diese Methoden dienen dazu, dem Client den vom Serverprogramm per CORBA bereitgestellten Partie-Manager bzw. Computerspieler zu finden. Aufgerufen wird holeManager zu Beginn der main-Methode, holeMeister am Anfang der spielen-Methode des Clients.
  4. Anwendung kompilieren und starten

    Den Server und den Client kompilieren, danach den osagent im Hintergrund starten, dann den Server. Dieser läut, bis man ihn unterbricht.
    Sobald man den osagent ausgeschaltet hat kann man sich auch schon wieder anderen Dingen zuwenden.
    linus[47][~/corba1/Corba1 ] 
    linus[48][~/corba1/Corba1 ] osagent &
    linus[50][~/corba1/Corba1 ] javac ServerAufg1/*.java
    linus[50][~/corba1/Corba1 ] javac ClientAufg1/*.java
    linus[51][~/corba1/Corba1 ] vbj ServerAufg1.Server
    Starten den Server (Anneliese).....
    ^C
    linus[52][~/corba1/Corba1 ] 
    linus[52][~/corba1/Corba1 ] ps
       PID TTY      TIME CMD
     18640 pts/17   0:00 osagent
     18550 pts/17   0:01 tcsh
    linus[53][~/corba1/Corba1 ] kill 18640
    Received signal (15)
    linus[54][~/corba1/Corba1 ] 
    [2]    Exit 1                        osagent
    linus[54][~/corba1/Corba1 ] ps
       PID TTY      TIME CMD
     18550 pts/17   0:01 tcsh
    linus[55][~/corba1/Corba1 ] exit
    logout
    Connection to linus closed.
    itt-2020:~>
    Exemplarisch ein einfachstes Spiel zwischen zwei menschlichen Gegnern:
    linus:~/corba1/Corba1>vbj ClientAufg1.Client

    4 gewinnt
    ---------

    1) Partie spielen
    2) Computergegner starten (Java)
    4) Computerbedenkzeit einstellen
    5) Partien auflisten
    7) Ende
    1

    Eingabe des Partienamens: Otto

    Sie sind Spieler 1
    warte auf Spieler 2...

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    |               |
    |               |
    |               |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 1 

    Zugdauer: 1 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    |               |
    |               |
    | 1             |
    -----------------
      1 2 3 4 5 6 7

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    |               |
    |               |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 1

    Zugdauer: 1 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    |               |
    | 1             |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    |               |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 1

    Zugdauer: 1 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    | 1             |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    | 1 2           |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7
     
     

    Ihr Zug (1-7): 1

    Zugdauer: 2 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    | 1             |
    | 1 2           |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7
     

    Sie haben gewonnen:

    |               |
    |               |
    | 1             |
    | 1 2           |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    4 gewinnt
    ---------

    1) Partie spielen
    2) Computergegner starten (Java)
    4) Computerbedenkzeit einstellen
    5) Partien auflisten
    7) Ende
    7
    linus:~/corba1/Corba1>

    linus:~/corba1/Corba1>vbj ClientAufg1.Client

    4 gewinnt
    ---------

    1) Partie spielen
    2) Computergegner starten (Java)
    4) Computerbedenkzeit einstellen
    5) Partien auflisten
    7) Ende
    5

    Partien zur Zeit:
    Otto
     

    4 gewinnt
    ---------

    1) Partie spielen
    2) Computergegner starten (Java)
    4) Computerbedenkzeit einstellen
    5) Partien auflisten
    7) Ende
    1
     

    Eingabe des Partienamens: Otto

    Sie sind Spieler 2
    warte auf Spieler 1...

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    |               |
    |               |
    | 1             |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 2

    Zugdauer: 3 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    |               |
    |               |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    |               |
    | 1             |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 2

    Zugdauer: 2 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    |               |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7
     
     

    Spielfeld zur Zeit:

    |               |
    |               |
    |               |
    | 1             |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    Ihr Zug (1-7): 2

    Zugdauer: 2 sec.

    Spielfeld nach dem Zug:

    |               |
    |               |
    |               |
    | 1 2           |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7
     

    Sie haben verloren:

    |               |
    |               |
    | 1             |
    | 1 2           |
    | 1 2           |
    | 1 2           |
    -----------------
      1 2 3 4 5 6 7

    4 gewinnt
    ---------

    1) Partie spielen
    2) Computergegner starten (Java)
    4) Computerbedenkzeit einstellen
    5) Partien auflisten
    7) Ende
    7
    linus:~/corba1/Corba1>

Blatt 3


  1. IDL-Datei

    Die IDL-Datei konnte von Blatt2 übernommen werden.
  2. Der Client

    Im Client sollte wie auf Blatt2 die beiden Methoden holeMeister(int typ) und holeManager() implementiert werden.
    Der Unterschied lag darin, dass hier der Server eine die Objekte mit einer Namensbindung in Namenskontexten zur Verfügung stellt, ähnlich einer Verzeichnisstruktur.
  3. Die Server

    Die Aufgabe, die Viergewinntdienste PartieManager und Meister zur Verfügung zu stellen war auf zwei Server verteilt. Dem Server fiel die Aufgabe zu, einen PartieManager und einen Meister in der angegebenen Namenkontextstruktur zur Verfügung zu stellen, wärend der Meister2 einen weiteren Meister in die Struktur einhängen sollte.

    Starten des Naming Service:

    madonna:~>tnameserv -ORBInitialPort 14375
    Initial Naming Context:
    IOR:000000000000002849444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f
    6e746578743a312e300000000001000000000000004c00010000000000246d61646f6e6e612e496e
    666f726d6174696b2e556e692d54756562696e67656e2e44650008f5000000000018afabcafe0000
    00027997e879000000080000000000000000
    TransientNameServer: setting port for initial object references to: 14375
     
     

    Nach dem Start des Name Service liefert die Anfrage nach allen gemeldeten Objekten:
    madonna:~/corba2>java Util.NamensLister -ORBInitialPort 14375
    Root context= null
    Keine Namen registriert!
    madonna:~/corba2>
     

    Starten des ersten Servers (Server)

    madonna:~/corba2>java ServerAufg2.Server -ORBInitialPort 14375
    Manager ist bereit.
    JAVAMeister ist bereit.
    NameService ist da
    das Verzeichnis "4 gewinnt" eingehängt..
    das Verzeichnis "Computergegner" eingehängt..
    das Verzeichnis "Partiemanager" eingehängt..
    javameister druntergehängt
    manager druntergehängt
     

    Nun liefert die Anfrage nach allen gemeldeten Objekten:
    madonna:~/corba2>java Util.NamensLister -ORBInitialPort 14375
    Root context= null
      Kontext= [{4 gewinnt,directory}]
        Kontext= [{Computergegner,directory}]
          Objekt= [{javameister,object}]
        Kontext= [{Partiemanager,directory}]
          Objekt= [{manager,object}]
    madonna:~/corba2>

    Starten des zweiten Servers (Meister2)

    madonna:~/corba2>java ServerAufg2.Meister2 -ORBInitialPort 14375
    JAVAMeister2 ist bereit.
    NameService ist da
    Versuche, JAVAMeister 2 reinzutun...wir waren erfolgreich. Nun kann es losgehen!
     

    Nun liefert die Anfrage nach allen gemeldeten Objekten:
    madonna:~/corba2>java Util.NamensLister -ORBInitialPort 14375
    Root context= null
      Kontext= [{4 gewinnt,directory}]
        Kontext= [{Computergegner,directory}]
          Objekt= [{javameister,object}]
          Objekt= [{javameister2,object}]
        Kontext= [{Partiemanager,directory}]
          Objekt= [{manager,object}]
    madonna:~/corba2>
    madonna:~/corba2>java Util.NamensLister -ORBInitialPort 14375
    Root context= null
      Kontext= [{4 gewinnt,directory}]
        Kontext= [{Computergegner,directory}]
          Objekt= [{javameister,object}]
          Objekt= [{javameister2,object}]
        Kontext= [{Partiemanager,directory}]
          Objekt= [{manager,object}]
    madonna:~/corba2>
  4. Abschalten

    Zu guter letzt muss wieder alles abgeschaltet werden. Die Server wie gehabt mit ^c hinterrücks ermorden. Wenn der Naming Service aber solchermassen tot gemacht ist, so auch alle Bindungen, die er kannte. So sind nun keine Resourcen mehr unnötig in Gebrauch, so dass man sich getrost mit einem beherzten exit verabschieden kann, bis man die Dienste der holden madonna wiedereinmal in Anspruch zu nehemen gedenkt oder gedenkt wird.

Blatt 4 - Servlets

Aufgabe 1

In dieser Aufgabe sollten wir ein Servlet erstellen, welches anhand des gesendeten Werts aus dem Formular in der .html Seite Aufg1.html eine Datenbankabfrage startet und eine .html Seite mit der Liste der Produkte erzeugt. Dazu sollte das Rahmenprogramm Aufg1Servlet.java erweitert werden.

Aufgabe 2

Zu tun war folgendes: Es gibt ein Applet, welches eine einfache GUI für ein MasterMind Spiel zur Verfügung stellt. Das Generieren der Spielcodes und das Überprüfen der Spielcode-Kandidaten übernimmt ein Servlet. Das Applet kommuniziert mit dem Servlet über ein einfaches Kommunikationsprotokoll, um dessen Dienste zu benutzen. Im mmApplet.java war der Benutzername noch nachzutragen. Das mmServlet.java verlangte nach einem einfachen Protokoll.

Zu beachten war, dass man den Classpath richtig setzt und auch alle benötigten Packages einbindet. Wir haben das explizit beim Kompilieren angegeben und nicht die Variable CLASSPATH neu gesetzt.



Die erweiterten Programme haben wir im richtigen Verzeichnis abgelegt und die Datenbank sowie die nötigen Packages noch in das selbe kopiert:
quak:/usr/opt/IBMWebAS/servlets/aufgaben/seyrich>ll 
total 52
-rw-r--r--   1 seyrich  WSIstud      5205 Jan 14 15:24 Aufg1Servlet.class
-rw-r--r--   1 seyrich  WSIstud      6077 Jan 14 15:24 Aufg1Servlet.java
-rwxr--r--   1 seyrich  WSIstud       193 Jan 11 14:57 jcAufg1Servlet
-rwxr--r--   1 seyrich  WSIstud       191 Jan 11 16:21 jcmmServlet
-rw-r--r--   1 seyrich  WSIstud      3886 Jan 15 12:48 mmServlet.class
-rw-r--r--   1 seyrich  WSIstud      6215 Jan 15 12:51 mmServlet.java
drwxr-xr-x   2 seyrich  WSIstud      4096 Jan 11 14:49 myClasses
drwxr-xr-x   3 seyrich  WSIstud      4096 Nov 28  2000 pizzasvc
quak:/usr/opt/IBMWebAS/servlets/aufgaben/seyrich>ls myClasses/
classes.tar  databeans.jar  ibmwebas.jar  jsdk.jar  jst.jar  xml4j.jar
quak:/usr/opt/IBMWebAS/servlets/aufgaben/seyrich>ls pizzasvc/
MessageBean.class            db
ShoppingCart.class           finishOrderServlet.class
ShoppingCartException.class  modifyOrderServlet.class
ShoppingCartItem.class       orderDataServlet.class
addItemServlet.class         pCategoriesServlet.class
config.class                 pDescriptionsServlet.class
quak:/usr/opt/IBMWebAS/servlets/aufgaben/seyrich>
 

Legt man nun noch die SeitenAufg1.html und mmind.html, sowie. eine Startseite index.htmlim richtigen Verzeichnis ab, ist man fertig:
quak:/usr/opt/home/cspuser/public_html/seyrich>ll
total 36
-rw-r--r--   1 seyrich  WSIstud      3026 Jan 15 14:53 Aufg1.html
-rw-r--r--   1 seyrich  WSIstud      2758 Jan 11 16:21 HttpMessage.class
-rw-r--r--   1 seyrich  WSIstud      3290 Jan 11 16:21 HttpMessage.java
-rw-r--r--   1 seyrich  WSIstud      3010 Jan 15 14:51 index.html
-rw-r--r--   1 seyrich  WSIstud      4918 Jan 11 17:40 mmApplet.class
-rw-r--r--   1 seyrich  WSIstud      5296 Jan 11 17:40 mmApplet.java
-rw-r--r--   1 seyrich  WSIstud      2900 Jan 15 14:54 mmind.html
quak:/usr/opt/home/cspuser/public_html/seyrich>
Die Ausgabe von Kontrollaugaben erfolgt bei Ausführung des Servlets über stderr in die Datei
/var/log/httpd.error_log
Dies ist zu Debugzwecken recht praktisch. Auch lässt sich die Nummer so schneller finden...
quak:/var/log>grep seyrich httpd.error_log
seyrich=============================
seyrich init
seyrich hole code
seyrich habe session
seyrich habe code
seyrich Valunames
seyrich putte: 74074
seyrich code reingeputtet
seyrich habe num
seyrich habe num geputtet: 0
seyrich theCode
seyrich tryNum
seyrich=============================
seyrich check
seyrich habe session
seyrich habe theCode: 74074
seyrich habe aCode: 12345
seyrich getValuNames():
        seyrich theCode
        seyrich tryNum
seyrich habe tryNum: 0
seyrich habe trynum puttet: 1
seyrich rechnen
seyrich fertig
seyrich=============================
seyrich check
seyrich habe session
seyrich habe theCode: 74074
seyrich habe aCode: 12345
seyrich getValuNames():
        seyrich theCode
        seyrich tryNum
seyrich habe tryNum: 1
seyrich habe trynum puttet: 2
seyrich rechnen
seyrich fertig
seyrich=============================
seyrich check
seyrich habe session
seyrich habe theCode: 74074
seyrich habe aCode: 12345
seyrich getValuNames():
        seyrich theCode
        seyrich tryNum
seyrich habe tryNum: 2
seyrich habe trynum puttet: 3
seyrich rechnen
seyrich fertig
quak:/var/log>
 

Und das wars auch schon. Man muss noch nicht einmal jemanden killen!

Blatt 5


Aufgabe 1

Die erste Aufgabe bestand darin, sich auf der IBM/S390 in das TSO-Subsystem einzuloggen. Danach war das Dataset anzulegen, in dem die Dateien der folgenden Aufgaben abzulegen waren.
Danach sollten zwei Testdateien mit Hilfe des ISPF-Editors angelegt und editiert werden.
Die Abgabe bestand in einem Screenshot der zweiten Datei PRAKTxy.TEST.CNTL(V1).
Bei der Benutzung des Editors sollte man beachten, dass die Kommandos zum Einfügen und Löschen von Zeilen in die Zeilennummerierung geschrieben werden müssen.

Aufgabe 2

Die yweite Aufgabe hatte zum Ziel ein eigenes c-Programm auf der Maschine yu schreiben, compilieren und auszuühren.
Dazu mussten die beiden Dataset
  • PRAKTxy.TEST.C
  • PRAKTxy.TEST.LOAD
    angelegt werden. In ersteres sollte der Quellquode des c-Programms abgelegt werden, wärend das andere dafür vorgesehen war, den ausführbaren Maschinencode, der mit Hilfe des Compileskript PRAKTxy.TEST.CNTL(V1) aus Aufgabe 1 erzeugt wurde, aufzunehmen.

    Als Steigerung musste ein eigenes c-Programm entworfen und mit einem angepassten Skript ausführbar gemacht werden.
    Abzugeben war der Screenshot

    • der Skriptdatei PRAKTxy.TEST.CNTL(V2):


    • des eigens entworfenen c-Programms PRAKTxy.TEST.C(V2):




    • deie Ausgabe des Programmes mit dem AufrufTSO CALL \'PRAKTxy.TEST.LOAD(V2):




 
 
© Sebastian Seyrich und Judith Bentele November 2001
Letze Änderung: 31. Januar 2001
Impressum und Datenschutz