Die Netz-Verbindung
-
Das Socket-Konzept
Sockets verwirklichen die UNIX-Idee, daß alle I/O-Operationen
für den Programmierer wie Datei-I/O aussehen sollen. Sie kümmern
sich um die Detail-Arbeit im Netzwerk wie Packet-Größen, Header,
verlorengegangene Packete etc. (siehe Vorlesung Rechnernetze).
Es gibt sieben grundlegende Socket-Operationen:
-
Verbindung aufbauen
-
Daten senden
-
Daten empfangen
-
Verbindung schließen
-
an einen Port binden
-
auf ankommende Daten warten
-
Verbindungen am Port annehmen
Für den Client sind nur 1. bis 5. interessant. Der Server braucht
2. bis 7.
-
Die Java-Klassen
-
java.net.InetAddress
Diese Klasse erleichtert das Arbeiten mit IP-Adressen.
Neben den üblichen Methoden (equals(), hashCode(), toString())
und einigen, die die Adresse in verschiedenen Formaten zurückgeben:
public String getHostName()
public byte[] getAddress()
public String getHostAddress()
sowie
public boolean isMulticastAddress()
besitzt InetAddress einige statische Methoden, die Adressen liefern:
public static InetAddress getByName(String host)
throws UnknownHostException
public static InetAddress[] getAllByName(String host)
throws UnknownHostException
public static InetAddress getLocalHost()
throws UnknownHostException
-
java.net.Socket
Dies ist die Socket-Klasse für den Client. Die Konstruktoren und
einige Methoden werden vom Server nicht benutzt, da die Verbindung vom
Client aufgebaut wird.
Die Streams zum Senden und Empfangen werden von folgenden Methoden
zurückgegeben:
public OutputStream getOutputStream() throws IOException
public InputStream getInputStream() throws IOException
Die Verbindung wird geschlossen mit:
public synchronized void close() throws IOException
Adresse und Port von beiden Enden der Verbindung erhält man von:
public InetAddress getInetAddress()
public int getPort()
public InetAddress getLocalAddress()
public int getLocalPort()
-
java.net.ServerSocket
Dies ist die Socket-Klasse für Server. Es gibt drei Konstruktoren:
public ServerSocket(int port) throws IOException
public ServerSocket(int port, int backlog)
throws IOException
public ServerSocket(int port, int backlog,
InetAddress bindAddr) throws IOException
backlog bestimmt die Länge der Warteschlange für ankommende
Verbindungen. Der dritte Konstruktor wird benutzt, wenn der Server nur
an einer von mehreren IP-Adressen horchen soll.
Auf eine Verbindung bewartet wird mit:
public Socket accept() throws IOException
Die Zeit, die gewartet wird, betrifft:
public synchronized void setSoTimeout(int timeout)
throws SocketException
public synchronized int getSoTimeout() throws IOException
Adresse und Port des Servers werden zurückgegeben von:
public InetAddress getInetAddress()
public int getLocalPort()
Der Server wird geschlossen (d.h. der Port freigegeben) mit:
public void close() throws IOException
Beispiel: "Hello World"-Server
Quellen: