Netzwerkprogrammierung: Unterschied zwischen den Versionen
Zeile 112: | Zeile 112: | ||
|<i>Client meldet sich an</i> || +OK Willkommen beim GossipServer | |<i>Client meldet sich an</i> || +OK Willkommen beim GossipServer | ||
|- | |- | ||
| <i>Gossip schreiben:</i><br>NEU <nachricht> || +OK Nachricht akzeptiert || <i>an alle Abonennten:</i><br>NEU <nachricht> <zeit> | | <i>Gossip schreiben:</i><br>NEU <nachricht> || +OK Nachricht akzeptiert<br><br>-ERR Nachricht zu lang || <i>an alle Abonennten:</i><br>NEU <nachricht> <zeit><br>--- | ||
|- | |- | ||
| <i>Gossip abonnieren:</i><br>ABO || +OK Abo akzeptiert || --- | | <i>Gossip abonnieren:</i><br>ABO || +OK Abo akzeptiert || --- | ||
|- | |- | ||
| <i>Gossip-Archiv lesen: </i><br>ARCHIV <YYYY-mm-dd> <YYYY-mm-dd> | | <i>Gossip-Archiv lesen: </i><br>ARCHIV <YYYY-mm-dd> <YYYY-mm-dd> | ||
|| +OK GossipArchiv<br><YYYY-mm-dd> <nachricht 1><br>...<br><YYYY-mm-dd> <nachricht n><br><b>.</b> | || +OK GossipArchiv<br><YYYY-mm-dd> <nachricht 1><br>...<br><YYYY-mm-dd> <nachricht n><br><b>.</b><br><br>-ERR Datum falsch || --- | ||
|| --- | |- | ||
| QUIT || +OK Tschuess<br><i>Trennt die Verbindung </i> || --- | |||
|- | |||
| <i><unbekannter Befehl></i> || -ERR unbekannter Befehl || --- | |||
|- | |||
| <i><Parameter fehlt></i> || -ERR Parameter fehlt || --- | |||
|} | |} |
Version vom 19. März 2013, 01:18 Uhr
Allgemeines
Netzwerkprogrammierung beschäftigt sich mit der Entwicklung von verteilten Anwendungen.
Dabei kommuniziert zumeist ein Server mit mehreren Clients.
Best Practices für Netzwerk-Protokolle
siehe: Protokoll_(IF)
Client-Programmierung
Für die Client-Programmierung stehen im Zentralabitur die Schnittstellen Connection.java und Client.java zur Verfügung.
Connection.java vs. Client.java
Die Schnittstellen fürs Zentralabitur stellen zwei Klassen zur Verfügung, mit denen auf der Client-Seite gearbeitet werden kann:
- Connection.java hat die folgenden Methode, um Nachrichten vom Server zu empfangen:
public String receive()
- Client.java hat die folgenden Methode, um Nachrichten vom Server zu empfangen:
public void processMessage(String pMessage
Die einfachere (=mit weniger Möglichkeiten) ist die Klasse Connection.java. Diese beiden Klassen werden in unterschiedlichen Szenarien benutzt:
- Connection.java wird genutzt, wenn der Server nur auf Anfragen des Clients reagiert, wie z.B. bei Mailprotokollen (SMTP oder POP3).
- Client.java wird genutzt, wenn der Server von sich aus aktiv werden kann. Das ist z.B. bei einem Chat der Fall, denn hier muss der Server Nachrichten eines anderen Client von sich aus an alle Clients weiterleiten können.
Connection.java vs. Client.java in der Programmierung
- Connection.java wird als Attribut benutzt, z.B.:
public class SMTPClient{
private Connection verbindung;
public SMTPClient(){
//Verbindung zum Mailserver herstellen
verbindung = new Connection("192.168.100.2", 25);
}
....
}
- Von Client.java dagegen wird eine Unterklasse gebildet, die die Fähigkeiten von Client.java erbt. Dabei muss die Methode
public void processMessage(String pMessage)
überschrieben werden, damit man auf die Nachrichten des Servers reagieren kann. Z.B.:
public class ChatClient extends Client{
public ChatClient(){
//Konstruktor der Klasse Client aufrufen!
//Dadurch wird die Verbindung zum (selbstprogrammierten) Chatserver hergestellt
super("192.168.100.100", 4444);
}
public void processMessage(String pMessage){
// jetzt das Protokoll abarbeiten
if(pMessage.startsWith("neu")){
// usw.
}
// usw.
}
}
Server-Programmierung
Für die Server-Programmierung gibt es die Klasse Server.java. Genauso wie bei Client.java muss die eigene Klasse von Server.java erben, um die Fähigkeiten von Server.java zu übernehmen, z.B.:
public class ChatServer extends Server{
public ChatServer(int pPort){
// Konstruktor der Klasse Server aufrufen!
// Dadurch wird der Server erzeugt.
super(pPort);
}
Wichtig ist, dass die Klasse ChatServer dann die folgenden Methoden überschreibt, um auf Ereignisse bei den Clients angemessen reagieren zu können:
public void processMessage(String pClientIP, int pClientPort, int pMessage)
public void processNewConnection(String pClientIP, int pClientPort)
public void processClosedConnection(String pClientIP, int pClientPort)
Von sich aus kann der Server aktiv werden, indem er...
- einem Client eine Nachricht schickt:
public void send(String pClientIP, int pClientPort, String pMessage)
- allen Clients eine Nachricht schickt:
public void sendToAll(String pMessage)
- einen Client rausschmeißt:
public void closeConnection(String pClientIP, int pClientPort)
- den Server zumacht:
public void close()
Wichtige Methoden der Klasse String
siehe String
Beispiel: GossipServer
Der GossipServer soll dazu dienen, Tratsch (=Gossip) weiterzuverbreiten. Ob das sinnvoll, moralisch bedenklich oder sogar schädlich ist, soll hier nicht diskutiert werden. Es gelten die folgenden Anforderungen:
- Gossip schreiben: Man kann sich am GossipServer anmelden und eine neue Nachricht hinterlassen. Die wird als Text und mit Datum/Uhrzeit gespeichert.
- Gossip abonnieren: Man kann sich am GossipServer anmelden und bekommt dann jede neu eintreffende Nachricht sofort geschickt.
- Gossip-Archiv lesen: Man kann alle Nachrichten von einem oder mehreren Tagen vom GossipServer abrufen.
Arbeitsschritte
- Protokoll definieren
- GossipServer:
- Implementationsdiagramm
- Implementierung
- GossipClient:
- Entscheidung für programmtechnische Grundlage: Client oder Connection?
- Implementierung
Protokoll
Client sendet | Server antwortet |
Server an alle |
---|---|---|
Client meldet sich an | +OK Willkommen beim GossipServer | |
Gossip schreiben: NEU <nachricht> |
+OK Nachricht akzeptiert -ERR Nachricht zu lang |
an alle Abonennten: NEU <nachricht> <zeit> --- |
Gossip abonnieren: ABO |
+OK Abo akzeptiert | --- |
Gossip-Archiv lesen: ARCHIV <YYYY-mm-dd> <YYYY-mm-dd> |
+OK GossipArchiv <YYYY-mm-dd> <nachricht 1> ... <YYYY-mm-dd> <nachricht n> . -ERR Datum falsch |
--- |
QUIT | +OK Tschuess Trennt die Verbindung |
--- |
<unbekannter Befehl> | -ERR unbekannter Befehl | --- |
<Parameter fehlt> | -ERR Parameter fehlt | --- |