Netzprogrammierung: URL-Schemata



Ähnliche Dokumente
1. URL Verbindungen in Java 2. Eigene URL Schemata 3. Authentifizierung in HTTP 4. Anfragen in HTTP 5. Vergleich mit RPC etal

Netzprogrammierung HTTP Kommunikation

Motivation. Inhalt. URI-Schemata (1) URI-Schemata (2)

Uniform Resource Identifiers (URI) und Domain Name Service (DNS)

Typumwandlungen bei Referenztypen

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Einführung in die Programmierung

Remote Method Invocation

Service Engineering. Einbindung von Web Services in eine Java-Anwendung. Prof. Dr. Andreas Schmietendorf 1. SoSe Service Engineering

Programmieren in Java

Programmieren II. Sockets. Vorlesung 16. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Sockets.

Objektorientierte Programmierung

Einführung in Javadoc

Javakurs zu Informatik I. Henning Heitkötter

Übungen zu Softwaretechnik

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Klausur zur Vorlesung Verteilte Systeme im SS 2007 Prof. Dr. Odej Kao 24. Juli 2007

Einführung in die Programmierung für Wirtschaftsinformatik

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java: Vererbung. Teil 3: super()

Der lokale und verteilte Fall

Modul 7 Uniform Resource Identifier (URI)

Computeranwendung und Programmierung (CuP)

Unsere Webapplikation erweitern

Programmieren in Java

Themen. Web Service - Clients. Kommunikation zw. Web Services

Abschnitt 12: Strukturierung von Java-Programmen: Packages

Algorithmen und Datenstrukturen

Programmierkurs Java

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

VS Praktikum 03 Konzept

STARFACE SugarCRM Connector

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Folgende Voraussetzungen für die Konfiguration müssen erfüllt sein: - Ein Bootimage ab Version Optional einen DHCP Server.

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Gebundene Typparameter

Anwendungsprotokolle: HTTP, POP, SMTP

WebService in Java SE und EE

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Transmission Control Protocol (TCP)

Große Übung Praktische Informatik 1

Web Sockets mit HTML5. Quelle:

ARCHITEKTUR VON INFORMATIONSSYSTEMEN

WPF Bindung. Dr. Beatrice Amrhein

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Internet online Update (Mozilla Firefox)

Anleitung zum Prüfen von WebDAV

FTP Tutorial. Das File Transfer Protocol dient dem Webmaster dazu eigene Dateien wie z.b. die geschriebene Webseite auf den Webserver zu laden.

Programmiermethodik. Übung 13

Pragmatik von Programmiersprachen

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Netzwerkprogrammierung

Testen mit JUnit. Motivation

Inhaltverzeichnis 1 Einführung Zugang zu den Unifr Servern Zugang zu den Druckern Nützliche Links... 6

Tagesprogramm

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS Universität zu Lübeck

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Prinzipien Objektorientierter Programmierung

Advanced Network Programming

Objektorientierte Programmierung. Kapitel 12: Interfaces

SEP 114. Design by Contract

Innere Klassen in Java

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

1 Polymorphie (Vielgestaltigkeit)

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

2. XML 2.1 XML 1.0 und XML Schema. Jörg Schwenk Lehrstuhl für Netz- und Datensicherheit

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Netzwerkprogrammierung & Threads

Einführung in die Java- Programmierung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Objektorientierte Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Anleitung über den Umgang mit Schildern

XML-Namensräume. Marc Monecke

Informatik B. Vorlesung 16 Netzwerkprogrammierung. Dr. Ralf Kunze

Bkvadmin2000 Peter Kirischitz

Web Grundlagen zum Spidering

Handbuch für Nutzer von Zertifikaten der Zertifizierungsstellen (CAs) des Bayerischen Behördennetzes (BYBN) zur Sicherung von s Teil C3:

Online-Publishing mit HTML und CSS für Einsteigerinnen

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

HBF IT-Systeme. BBU-BSK Übung 2 Stand:

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Referat: Netzwerkprogrammierung in Java

Einführung in die Programmierung Blockkurs Java

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Networking. JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network. Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H.

Erstellen eigener HTML Seiten auf ewon

Windows 98 / Windows NT mit NCP WAN Miniport-Treiber 23. Oktober 1998

Kontrollfragen: Internet

Transkript:

Netzprogrammierung: URL-Schemata Robert Tolksdorf und Peter Löhr

Überblick 1. Vereinheitlichte Dienstnutzung in Java 3 2. Eigene URL-Schemata 24 3. Push- und Pull-Interaktion 28 Robert Tolksdorf und Peter Löhr 2

Vereinheitlichte Dienstnutzung in Java Robert Tolksdorf und Peter Löhr

URI, URL, URN Uniform Resource Identifier - URI:... is a compact string of characters for identifying an abstract or physical resource [RFC 2396] Syntax: absoluteuri = scheme ":"... relativeuri =...... Beispiele: ftp://ftp.is.co.za/rfc/rfc1808.txt gopher://spinaltap.micro.umn.edu/00/weather/los%20angeles http://www.math.uio.no/faq/compression-faq/part1.html mailto:mduerst@ifi.unizh.ch news:comp.infosystems.www.servers.unix file:/users/lohr/tmp/abc urn:isbn:n-nn-nnnnnn-n URI-Schema (scheme) typisiert URIs (ftp, gopher, fax, file, ) Robert Tolksdorf und Peter Löhr 4

URI, URL, URN Uniform Resource Locator - URL:... is a compact string representation for a resource available via the Internet. [RFC 1738] URL ist ein URI, dessen Schema auf die Zugreifbarkeit der Ressource im Netz hinweist, z.b. ftp://ftp.is.co.za/rfc/rfc1808.txt Uniform Resource Name - URN:... are intended to serve as persistent, location-independent, resource identifiers and are designed to make it easy to map other namespaces into URN-space [RFC 2141] Syntax: URN = "urn:" namespaceidentifier ":" string z.b. urn:isbn:n-nn-nnnnnn-n Ist eher URI, der Eigenschaft der Resource beschreibt URN-Namensraum strukturiert URNs (isbn, issn,...) Robert Tolksdorf und Peter Löhr 5

URL URL-Schemata sind für Internet-Dienste definiert und vereinheitlichen damit deren Nutzung syntaktisch: http://grunge.cs.tu-berlin.de:8000/ ftp://ftp.cs.tu-berlin.de/pub/net/www mailto:tolk@inf.fu-berlin.de Form: http://grunge.cs.tu-berlin.de:8000/res/data.html#top Protokoll Rechnername Portnummer Pfad Ressource Stelle Für URLs ist nur die Syntax definiert; die Semantik hängt vom Schema ab (das durch ein Protokoll umgesetzt wird). Robert Tolksdorf und Peter Löhr 6

java.net.url URLs als Objekte der Java-klasse java.net.url Konstruktoren: Aus Zeichenkette: URL(String spec) Aus Komponenten: URL(String protocol, String host, String file) URL(String protocol, String host, int port, String file) Relativ zu anderer URL URL(URL context, String spec) Mit eigenem Protokollobjekt URL(String protocol, String host, int port, String file, URLStreamHandler handler) URL(URL context, String spec, URLStreamHandler handler) Robert Tolksdorf und Peter Löhr 7

java.net.url Bestandteile erfragen: String getauthority() String String String int String String String getfile() gethost() getpath() getport() getprotocol() getquery() getref() String getuserinfo() Vergleichen: boolean equals(object obj) boolean samefile(url other) Darstellung als Zeichenkette String tostring() Robert Tolksdorf und Peter Löhr 8

... und zur Abwechslung mal Perl $ cat uri #!/usr/bin/perl use URI; $url = URI->new($ARGV[0]); print "Scheme: ", $url->scheme( ), "\n"; print "Userinfo: ", $url->userinfo( ), "\n"; print "Hostname: ", $url->host( ), "\n"; print "Port: ", $url->port( ), "\n"; print "Path: ", $url->path( ), "\n"; print "Query: ", $url->query( ), "\n"; $ uri http://www.cnn.com:mainpage@129.170.213.101:80/research.php Scheme: http Userinfo: www.cnn.com:mainpage Hostname: 129.170.213.101 Port: 80 Path: /research.php Query: $ Nicht Bestandteil der HTTP_ Spezifikation, aber von vielen Browsern akzeptiert (und meist ignoriert) (Sicherheitsrisiko!) Robert Tolksdorf und Peter Löhr 9

URLConnection Man kann sich über eine Verbindung zu einer durch eine URL bezeichnete Ressource verbinden : URLConnection openconnection() Das für das Schema zuständige Protokoll muss implementiert sein; Prüfung (Unix): currentjdk/classes $ jar tf classes.jar grep URLConnection.class sun/net/www/protocol/ftp/ftpurlconnection.class sun/net/www/protocol/gopher/gopherurlconnection.class sun/net/www/protocol/http/httpurlconnection.class sun/net/www/protocol/mailto/mailtourlconnection.class java/net/httpurlconnection.class sun/net/www/protocol/jar/jarurlconnection.class java/net/jarurlconnection.class sun/net/www/protocol/file/fileurlconnection.class sun/net/www/urlconnection.class java/net/urlconnection.class currentjdk/classes $ Robert Tolksdorf und Peter Löhr 10

Beispiel: Dateien lesen... import java.net.*; import java.io.*; public class GetFile { public static void main(string[] argv) throws IOException { URL url = new URL(argv[0]); URLConnection connection = url.openconnection(); } } BufferedReader in = new BufferedReader(new InputStreamReader( connection.getinputstream())); String line; while ((line = in.readline())!= null) System.out.println(line); in.close(); Robert Tolksdorf und Peter Löhr 11

... mit Schema http: $ java GetFile http://www.mi.fu-berlin.de/~lohr/advent.txt Es treibt der Wind im Winterwalde die Flockenherde wie ein Hirt, und manche Tanne ahnt, wie balde sie fromm und lichterheilig wird, und lauscht hinaus. Den wei?en Wegen streckt sie die Zweige hin? bereit, und wehrt dem Wind und w?chst entgegen der einen Nacht der Herrlichkeit. $ (Rilke) Robert Tolksdorf und Peter Löhr 12

... mit Schema ftp: $ java GetFile ftp://ftp.inf.fu-berlin.de drwxrwxr-x 4 ftp ftp 4096 Oct 26 04:05 incoming drwsr-xr-x 2 ftp ftp 4096 Feb 8 2008 log drwx------ 2 ftp ftp 4096 Oct 27 2005 lost+found drwxrws--- 2 ftp ftp 4096 Oct 20 21:16 mathfilm2008 drwxrws--- 2 ftp ftp 4096 May 30 2008 mevis drwxr-xr-x 2 ftp ftp 4096 Aug 2 2007 msgs drwxrwxr-t 50 ftp ftp 4096 Oct 7 14:47 pub $ java GetFile ftp://ftp.inf.fu-berlin.de/pub/readme This is only a local File-Hierarchy of 'math.fu-berlin.de'! ==== For public-domain Software and other unspecific Information use server 'ftp.fu-berlin.de' (do anonymous ftp at ftp.fu-berlin.de....... $ Robert Tolksdorf und Peter Löhr 13

... mit Schema file: Der Effekt von cat uri wird auch erzielt mit $ java GetFile file:/users/lohr/tmp/uri #!/usr/bin/perl use URI; $url = URI->new($ARGV[0]); print "Scheme: ", $url->scheme( ), "\n"; print "Userinfo: ", $url->userinfo( ), "\n"; print "Hostname: ", $url->host( ), "\n"; print "Port: ", $url->port( ), "\n"; print "Path: ", $url->path( ), "\n"; print "Query: ", $url->query( ), "\n"; $ (Warum einfach, wenn es auch kompliziert geht! ;-) Robert Tolksdorf und Peter Löhr 14

Datei schreiben mit Schema ftp: import java.net.*; import java.io.*; public class PutFile { public static void main(string[] argv) throws IOException { URL url = new URL("ftp://ftp.inf.fu-berlin.de/incoming/lohrfile"); URLConnection connection = url.openconnection(); PrintWriter out = new PrintWriter(connection.getOutputStream()); out.println("vom Eise befreit sind Strom und Bäche"); out.close(); } } $ java PutFile $ java GetFile ftp://ftp.inf.fu-berlin.de/incoming/ drwxr-xr-x 2 ftp ftp 4096 Jul 6 03:05 kia -rw-r--r-- 1 ftp ftp 38 Dec 12 07:56 lohrfile drwxrwx--- 2 ftp ftp 4096 Sep 29 12:45 tcimage $ Robert Tolksdorf und Peter Löhr 15

java.net.urlconnection Zustände von URLConnection nicht verbunden verbunden geschlossen connect() wechselt von nicht verbunden zu verbunden, falls noch nicht verbunden. Einige Methoden, die eine Verbindung brauchen, wechseln implizit zu verbunden (getinputstream,... ) Robert Tolksdorf und Peter Löhr 16

java.net.urlconnection Abfragen der Eigenschaften der Ressource Object getcontent() (z.b. Eingabestrom-Objekt) String getheaderfield(string name) InputStream getinputstream() OutputStream getoutputstream() Übliche Kopfzeilen-Information getcontentencoding() (Kompression) getcontentlength() getcontenttype() getdate() getexpiration() (MIME-Typ und Zeichensatz) getlastmodifed()... sind unter Umständen errechnet oder leer Robert Tolksdorf und Peter Löhr 17

Informationen über eine Seite holen import java.net.*; import java.io.*; public class GetInfo { public static void main(string[] argv) throws Exception{ URL page = new URL(argv[0]); URLConnection connection = page.openconnection(); System.out.println("Länge: " +connection.getcontentlength()); System.out.println("Typ: " +connection.getcontenttype()); System.out.println("Klasse:\n"+connection.getContent().getClass()); } } $ java GetInfo http://www.inf.fu-berlin.de L?nge: 23761 Typ: text/html; charset=utf-8 Klasse: class sun.net.www.protocol.http.httpurlconnection$httpinputstream $ Robert Tolksdorf und Peter Löhr 18

Informationen über eine Seite holen $ java GetInfo http://www.mi.fu-berlin.de/~lohr/classes/echo/factory.class L?nge: 227 Typ: application/x-java-vm Klasse: class sun.net.www.protocol.http.httpurlconnection$httpinputstream $ java GetInfo http://www.inf.fu-berlin.de/styles/inst-title-600x400.jpg L?nge: 11947 Typ: image/jpeg Klasse: class sun.awt.image.urlimagesource $ $ java GetInfo ftp://ftp.ietf.org L?nge: -1 Typ: content/unknown Klasse: class sun.net.www.protocol.ftp.ftpurlconnection$ftpinputstream $ Robert Tolksdorf und Peter Löhr 19

java.net.urlconnection Setzen von Eigenschaften der Anfrage setallowuserinteraction(boolean b) Anfrage findet in Interaktion mit dem Benutzer statt setdoinput(boolean b) Klient will von Verbindung lesen (Voreinstellung: true) setdooutput(boolean b) Klient will auf Verbindung schreiben (Voreinstellung: false) setifmodifiedsince(string s) IfModifiedSince-Kopfzeile setzen setusecaches(boolean b) Zwischenspeichern von Daten erlauben (Voreinstellung: true) setrequestproperty(string key, String value) Kopfzeile setzen Robert Tolksdorf und Peter Löhr 20

Beispiel: Sprache einstellen import java.net.*; import java.io.*; public class GetInfoLang { public static void main(string[] argv) throws Exception{ URL page=new URL(argv[0]); URLConnection connection=page.openconnection(); if (argv.length == 2) connection.setrequestproperty("accept-language",argv[1]); System.out.println("Laenge: "+connection.getcontentlength()); System.out.println("Typ: "+connection.getcontenttype()); System.out.println("Klasse:\n"+connection.getContent().getClass()); } } Robert Tolksdorf und Peter Löhr 21

Eine mehrsprachige Website $ java GetInfoLang http://www.cs.tut.fi/~jkorpela/multi Laenge: 1848 Typ: text/html Klasse: class sun.net.www.protocol.http.httpurlconnection$httpinputstream $ java GetInfoLang http://www.cs.tut.fi/~jkorpela/multi en Laenge: 1878 Typ: text/html.../index-en.htm! Klasse: class sun.net.www.protocol.http.httpurlconnection$httpinputstream $ java GetInfoLang http://www.cs.tut.fi/~jkorpela/multi de Laenge: 2433 Typ: text/html.../index-de.htm! Klasse: class sun.net.www.protocol.http.httpurlconnection$httpinputstream Robert Tolksdorf und Peter Löhr 22

Eigene URL-Schemata Robert Tolksdorf und Peter Löhr

Eigene URL-Schemata URL-System in Java ist um neue Schemata erweiterbar. Beispiel: daytime (für den Internet-Dienst auf Port 13). Dazu müssen definiert werden eine Klasse DaytimeURLConnection extends URLConnection eine Klasse Handler extends URLStreamHandler Sie müssen in einem Paket stehen, z.b. in package mypacks.daytime Durch die Property java.protocol.handler.pkgs muss dem Laufzeitsystem mitgeteilt werden, wo die eigenen Klassen stehen: $ java -Djava.protocol.handler.pkgs=mypacks \ GetInfo daytime://localhost Robert Tolksdorf und Peter Löhr 24

Daytime URLs package mypacks.daytime; import java.net.*; import java.io.*; public class DaytimeURLConnection extends URLConnection { Socket socket; public DaytimeURLConnection(URL url) { super(url); } public void connect() throws IOException { socket = new Socket(url.getHost(), 13); } public Object getcontent() throws IOException { connect(); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getinputstream())); return in.readline(); } } Robert Tolksdorf und Peter Löhr 25

Daytime URLs package mypacks.daytime; import java.net.*; public class Handler extends URLStreamHandler{ protected URLConnection openconnection(url u) { return new DaytimeURLConnection(u); } } $ java -Djava.protocol.handler.pkgs=mypacks \ GetInfo daytime://localhost 12 DEC 2008 16:15:06 CET $ Robert Tolksdorf und Peter Löhr 26

Push- und Pull-Interaktion Robert Tolksdorf und Peter Löhr

Client-Pull und Server-Push HTTP-Interaktion mit Anfrage und Antwort wird durch Client-Pull und Server-Push erweitert: Client-Pull Klient lädt Inhalte in regelmäßigen Abständen nach Server löst das Verhalten durch zusätzliche Kopfzeile aus Server-Push Anbieter schickt mehrere Antworten nacheinander Klient ersetzt jeweils die Darstellung Robert Tolksdorf und Peter Löhr 28

Client-Pull Server gibt in der Antwort zusätzliche Kopfzeile an: Refresh: seconds;... Beispiel: Refresh: 60; Korrekter Browser nimmt das zur Kenntnis und lädt regelmäßig die Seite nach. Robert Tolksdorf und Peter Löhr 29

Beispiel: Dynamische Zeitanzeige import java.net.*; import java.io.*; public class TimeServer { public static void main(string[] argv) throws Exception { ServerSocket ss= new ServerSocket(Integer.parseInt(argv[0])); while (true) { Socket socket=ss.accept(); (new BufferedReader( // Kopfzeile lesen - und ignorieren new InputStreamReader( socket.getinputstream()))).readline(); PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println("http/1.1 200 Ok\n"+ "Content-type: text/html\n"+ "Refresh: 1;\n\n"+ "<html><head><title>date</title></head>\n"+ "<body><p>es ist hier gerade "+ new java.util.date()+ "</body></html>\n"); out.flush(); socket.close(); } } } Testen mit Browser! Robert Tolksdorf und Peter Löhr 30

Server-Push Anbieter liefert eine Antwort vom Medientyp multipart/mixed an den Klienten Markierung trennt mehrere vollständigen Antwortteile Klient ersetzt Darstellung durch jeweils neuen Antwortteil Server verzögert Auslieferung von jedem Antwortteil: HTTP/1.1 200 Ok Content-type: multipart/mixed;boundary=meinseitenwechsel --meinseitenwechsel Content-type: text/html <html><head><title>ping</title></head><body> <h2>ping!</h2></body></html> --meinseitenwechsel Content-type: text/html <html><head><title>pong</title></head><body> <h2>pong!</h2></body></html> (Pause) Robert Tolksdorf und Peter Löhr 31

Server-Push import java.net.*; import java.io.*; import java.util.*; public class ServerPush { public static void main(string[] argv) throws Exception { int port = Integer.parseInt(argv[0]); int pause = 1000 * (argv.length<2? 1 : Integer.parseInt(argv[1])); ServerSocket s = new ServerSocket(port); while (true) { Socket socket = s.accept(); //nix lesen! PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println( "HTTP/1.1 200 Ok\n + "Content-type: multipart/mixed; boundary=seite\n");... Robert Tolksdorf und Peter Löhr 32

Server-Push... while (!out.checkerror()) { out.println("--seite\ncontent-type: text/html\n"); out.println( "<html><head>" + "<title>date</title></head>\n" + "<body><p><br>" + "Es ist hier gerade " + new Date() + "</body></html>\n"); out.flush(); Thread.sleep(pause); } out.println("\n--seite--\n"); socket.close(); } } } Testen z.b. mit Firefox (nicht Safari!) Robert Tolksdorf und Peter Löhr 33

Literatur www.ietf.org T. Berners-Lee, R. Fielding, L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. RFC 2396. 1998 Berners-Lee, T., Masinter, L., and M. McCahill, Editors. Uniform Resource Locators (URL), RFC 1738, December 1994. Moats, R. URN Syntax, RFC 2141, May 1997. Joint W3C/IETF URI Planning Interest Group. URIs, URLs, and URNs: Clarifications and Recommendations 1.0. W3C Note. 2001. http://www.w3.org/tr/uri-clarification. Auch RFC 3305. The Official IANA Registry of URI Schemes. http://www.iana.org/assignments/uri-schemes The Official IANA Registry of URN Namespaces. http://www.iana.org/assignments/urn-namespaces Robert Tolksdorf und Peter Löhr 34