sockets

Werbung
Learning By Doing
Netzwerke mit TCP/IP
• Das Internet verwendet weitgehend das rund 30-jährige TCP/IP-Protokoll
(TCP: Transmission Control Protocol, IP: Internet Protocol)
• Jedes teilnehmende Gerät (Computer, Drucker, usw.), Knoten genannt, besitzt eine eindeutige IP-Adresse aus 4 bytes = 32 bit, in der gepunkteten Form nnn.nnn.nnn.nnn, wo nnn
eine Dezimalzahl zwischen 0 und 255 ist, beispielsweise 130.92.13.49. Ein hierarchischer
Domain Name Service (DNS) erlaubt die Verwendung von IP-Aliasis, z.B. www.unibe.ch
• Unter TCP/IP werden die Informationen paketweise übertragen. Es ist fehlertolerant, da
an Hand einer Prüfsumme Fehler erkannt und ein fehlerhaftes Paket neu angefordert werden
• TCP/IP beruht auf einer Client-Server-Hierarchie und nicht auf einem Netzwerk gleichwertiger
Knoten (kein peer-to-peer)
• Ein Client führt einen Request an eine bestimmte IP-Adresse mit Angabe eines bestimmten
Ports (0...65535) aus. Ein Demon des Servers überwacht diesen Port, nimmt den Request
entgegen, verarbeitet ihn und liefert einen Response an den Client zurück
Client 1
Request
Server
130.92.13.49
212.243.19.1
Demon
Client 2
212.243.19.2
Response
Port 80
Demon
Port 3306
Client 3
212.243.19.3
s. Buch S. 503ff
Learning By Doing
Sockets
• Sockets legen so viele Schichten über die Komplexität der Netzwerkverbindungen, dass
diese wie ein Datenstrom (Stream), analog einer Dateioperation, aufgefasst werden können
• Einen Socket kann man auch als Zugangspforte eines IP-Verbindungskanals zwischen
einem Server (Host) und einem Client auffassen
• Für einen Client sind die wichtigsten Socket-Operationen:
- Verbindung erstellen (open)
- Daten senden (send)
- Daten empfangen (read)
- Verbindung beenden (close)
• Für einen Server kommen noch folgende Operationen hinzu:
- Binden eines IP-Ports (bind)
- Verbindungsaufforderung annehmen (accept)
• In Java werden Sockets ausserordentlich gut unterstützt, Socket-Programmierung ist
daher verglichen mit anderen Programmiersprachen mit wenig Aufwand verbunden
• Socket-Programmierung ist im Internet-Zeitalter sehr motivierend und eignet sich gut
für den thematischen Unterricht und Maturaarbeiten
Learning By Doing
// WbzEx20.java
Daytime-Client
import java.net.*;
import java.io.*;
import ch.aplu.util.*;
Nach der Annahme der Verbindung
auf Port 13 sendet der Server einen
String mit der aktuellen Datums-Zeit
public class WbzEx20 extends Console
{
private static final String
HOSTNAME = "ntp1.ptb.de";
private static final int
PORT = 13;
public WbzEx20()
{
BufferedReader reader = null;
Socket socket = null;
String line;
println("Trying to connect to " +
HOSTNAME + "...");
try
Verbindung erstellen
{
socket = new Socket(HOSTNAME, PORT);
println("Connection established");
Timeout für
socket.setSoTimeout(15000); // 15 sec
readline()
Stream erzeugen
reader = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
println("Response:");
while ((line = reader.readLine()) != null)
{
Daten vom
println(line);
Host lesen
Daten aus}
}
blockierend
}
schreiben
Phys.-Techn. Bundesanstalt
catch (IOException ex)
{
println("Error " + ex);
}
finally
{
Stream und Socket
try
schliessen
{
if (reader != null)
reader.close();
if (socket != null)
socket.close();
}
catch (IOException ex) {}
}
}
public static void main(String args[])
{
new WbzEx20();
}
Learning By Doing
// WbzEx20a.java
... (wie WbzEx20.java)
public class WbzEx20a extends Console
{
private static final String HOSTNAME =
"www.unibe.ch";
private static final int PORT = 80;
Web-Reader
Nach der Annahme der Verbindung auf Port 80 sendet
der Client den HTTP-String
GET / HTTP/1.0
gefolgt von zwei Leerzeilen
public WbzEx20a()
{
BufferedReader reader = null;
Socket socket = null;
String line;
println("Trying to connect to " + HOSTNAME + "...");
try
{
socket = new Socket(HOSTNAME, PORT);
socket.setSoTimeout(15000); // 15 sec
println("Connection established");
PrintWriter out = new
PrintWriter(socket.getOutputStream());
out.print("GET / HTTP/1.0\r\n\r\n");
out.flush();
reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
println("Response:");
while ((line = reader.readLine()) != null)
{
println(line);
}
}
... (wie WbzEx20.java)
Output-Stream erzeugen
HTTP GET-Request
Stream leeren, damit mit
Sicherheit ausgeschrieben
Response lesen und
ausschreiben
Herunterladen