Protokoll (IF): Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 19: Zeile 19:
# Man braucht im Protokoll i.A. '''3 Spalten''': Client sendet, Server antwortet, Server an alle
# Man braucht im Protokoll i.A. '''3 Spalten''': Client sendet, Server antwortet, Server an alle
# '''Die Parameter werden in spitzen Klammern notiert''', z.B.: PRIVAT max Hallo Max, wie gehts? steht im Protokoll als: '''PRIVAT <name> <nachricht>'''
# '''Die Parameter werden in spitzen Klammern notiert''', z.B.: PRIVAT max Hallo Max, wie gehts? steht im Protokoll als: '''PRIVAT <name> <nachricht>'''
# Jeder Befehl hat die gleiche Länge. Das gilt vor allem für Befehle, die vom Client an den Server gesendet werden. Hintergrund: Bei einer Befehlslänge von beispielsweise 5 Buchstaben kann man dann die Parameter erhalten, indem man <code>pMessage.substring(6);</code> aufruft. Den Befehl kann man auf der Serverseite wie folgt abfragen: <code>if(pMessage.startsWith("+BEFEHL"))</code>
# '''Jede Nachricht startet mit einem Befehl'''
# '''Jede Nachricht startet mit einem Befehl'''
# '''Jede Antwort des Servers startet mit "-" oder "+" und einem Befehl'''
# '''Jede Antwort des Servers startet mit "-" oder "+" und einem Befehl'''
# Es gibt eine '''globale Rückmeldung für unbekannte Befehle''', z.B. -UNKNOWN
# Wenn ein Befehl mehrere Zeilen verschickt, dann wird als letzte Zeile ein einzelner Punkt verschickt. Dieser ist die '''Endmarke'''.# Es gibt eine '''globale Rückmeldung für unbekannte Befehle''', z.B. -UNKNOWN
# Es gibt eine '''globale Rückmeldung für fehlende Parameter oder Parameter zuviel''', z.B. -param <befehl> Parameterzahl falsch
# Es gibt eine '''globale Rückmeldung für fehlende Parameter oder Parameter zuviel''', z.B. -param <befehl> Parameterzahl falsch
# Wenn ein Befehl mehrere Zeilen verschickt, dann wird als letzte Zeile ein einzelner Punkt verschickt. Dieser ist die '''Endmarke'''.


=Beispiel: GossipServer=
=Beispiel: GossipServer=

Version vom 3. November 2013, 09:59 Uhr


Typische Netzwerk-Protokolle

Die Links verweisen auf den Eintrag in Wikipedia:

  • SMTP: Simple Mail Transfer Protocol (zum Mails schicken)
  • POP3: Post Office Protokol (zum Mails empfangen)
  • IMAP: Internet Message Access Protokol (zum Mails empfangen)
  • HTTP: Hyptext Transfer Protokol (zur Übertragung von Internet-Seiten; dieses Protokoll versteht der Browser)
  • FTP: File Transfer Protokol (zur Übertragung von Dateien)

SMTP, POP3 und IMAP werden im Unterricht thematisiert.

Best practices für die Entwicklung von Protokollen

Diese Best practices orientieren sich an dem, was man für das Zentralabitur braucht.

Wichtig ist vor allem, dass das Protokoll vollständig ist (d.h. dass es für jede Situation eine Protokoll-Lösung gibt) und dass das Protokoll auf Client-Seite und auf Server-Seite einfach auszuwerten ist.

  1. Man braucht im Protokoll i.A. 3 Spalten: Client sendet, Server antwortet, Server an alle
  2. Die Parameter werden in spitzen Klammern notiert, z.B.: PRIVAT max Hallo Max, wie gehts? steht im Protokoll als: PRIVAT <name> <nachricht>
  3. Jede Nachricht startet mit einem Befehl
  4. Jede Antwort des Servers startet mit "-" oder "+" und einem Befehl
  5. Wenn ein Befehl mehrere Zeilen verschickt, dann wird als letzte Zeile ein einzelner Punkt verschickt. Dieser ist die Endmarke.# Es gibt eine globale Rückmeldung für unbekannte Befehle, z.B. -UNKNOWN
  6. Es gibt eine globale Rückmeldung für fehlende Parameter oder Parameter zuviel, z.B. -param <befehl> Parameterzahl falsch

Beispiel: GossipServer

Spezifikation

Der GossipServer soll dazu dienen, Tratsch (=Gossip) zu speichern und weiter zu verbreiten. Es gelten die folgenden Anforderungen:

  1. Gossip schreiben: Man kann sich am GossipServer anmelden und eine neue Nachricht hinterlassen. Die wird als Text und mit Datum/Uhrzeit gespeichert.
  2. Gossip abonnieren: Man kann sich am GossipServer anmelden und bekommt dann jede neu eintreffende Nachricht sofort geschickt.
  3. Gossip-Archiv lesen: Man kann alle Nachrichten von einem oder mehreren Tagen vom GossipServer abrufen. Dies erledigt die Klasse GossipClient.java.

Protokoll

Das Protokoll besteht aus 3 Spalten:

  • Client sendet
  • Server antwortet (einem Client)
  • Server an alle
Client sendet Server antwortet
(einem Client)

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 <zeit>--<nachricht>
---
Gossip abonnieren:
ABO
+OK Abo akzeptiert ---
Gossip-Archiv lesen:
ARCHIV <zeit1> <zeit2>
+OK GossipArchiv
<zeit 1>--<nachricht 1>
...
<zeit n>--<nachricht n>
.

-ERR Datum falsch
---
QUIT +OK Tschuess
Trennt die Verbindung
---
<unbekannter Befehl> -ERR unbekannter Befehl ---
<Parameter fehlt> -ERR Parameter fehlt ---

Für die Implementierung des GossipServers: siehe Netzwerkprogrammierung

Protokolle mit Java auswerten

Beispiel: Der Client sendet:

+MESSG***achim***hallo wie geht's? (D.h. das Protokoll hat "***" als Trennzeichen)

Dann lässt sich das so auswerten:

 public void processMessage(String pClientIP, int pClientPort, String pMessage){
   if(pMessage.startsWith("-")){
     // TODO: Fehlermeldung abarbeiten!
     return;
   }
   if(pMessage.startsWith("+")){
     // eine normale Servermeldung!
     String befehl = pMessage.substring(1,6);
     if(befehl.equals("MESSG")){
        // die Nachricht nach den Trennzeichen ("***") aufspalten und in das Array splits speichern
        // index 0: befehl
        // index 1: erster Parameter (=empfaenger)
        String[] splits = pMessage.split("***");
        String empfaenger = splits[1];
        String nachricht = splits[2];
        //TODO: Nachricht an Empfaenger weiterschicken
        return;
     }
     //TODO: Weitere Befehle überprüfen.
   }
   //TODO: Fehlerfall! Nachricht startet weder mit "+" noch mit "-"
 }


Befehle auswerten, die mehrere Zeilen schicken

Manche Befehle führen dazu, dass mehrere Zeilen verschickt werden. Das kann zu einem Problem führen, wenn man die Klasse Connection.java verwendet; denn hier muss der Client von sich aus die Methode receive() aufrufen, um den nächsten Teil der Nachricht abzurufen.

Üblicherweise wird im Protokoll dann zum Schluss ein einzelner Punkt verschickt.


Beispiel (man beachte den Punkt in der letzten Zeile der Serverantwort!!

Client sendet Server antwortet

Server an alle

ALLE

+ALLE
max
martina
stefanie
justus
herbert
.

<entfällt>

Man beachte den Punkt in der letzten Zeile unter herbert!

Das lässt sich so auswerten:

  private Connection verbindung;
  
  public List alleTeilnehmer(){
     // den Server auffordern, alle Teilnehmer zu senden:
     verbindung.send("ALLE");
     List ergebnis = new List();
     String antwort = verbindung.receive();
     if(antwort.equals("+ALLE")){
        String name = verbindung.receive();
        while(name.equals(".") == false){
           ergebnis.append(name);
           name = verbindung.receive();
        }
     }
     return ergebnis;
  }