Protokoll (IF): Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 23: Zeile 23:
Beispiel: Der Client sendet:
Beispiel: Der Client sendet:


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


(D.h. das Protokoll hat "---" als Trennzeichen)
Dann lässt sich das so auswerten:


Dann lässt sich das so auswerten:
<code>
<code>
   public void processMessage(String pClientIP, int pClientPort, String pMessage){
   public void processMessage(String pClientIP, int pClientPort, String pMessage){
Zeile 38: Zeile 37:
       String befehl = pMessage.substring(1,6);
       String befehl = pMessage.substring(1,6);
       if(befehl.equals("MESSG")){
       if(befehl.equals("MESSG")){
         String[] splits = pMessage.split("---");
         String[] splits = pMessage.split("***");
         String empfaenger = splits[1];
         String empfaenger = splits[1];
         String nachricht = splits[2];
         String nachricht = splits[2];
Zeile 48: Zeile 47:
     //TODO: Fehlerfall! Nachricht startet weder mit "+" noch mit "-"
     //TODO: Fehlerfall! Nachricht startet weder mit "+" noch mit "-"
   }
   }
</code>
=== 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:'''
''Client sendet: ''
ALLE
''Server antwortet:''
+ALLE
max
martina
stefanie
justus
herbert
.
Das lässt sich so auswerten:
<code>
  private Connection verbindung;
 
  public List alleTeilnehmer(){
      // den Server auffordern, alle Teilnehmer zu senden:
      verbindung.send("ALLE");
      List ergebnis = new List();
      String befehl = verbindung.receive();
      if(befehl.equals("+ALLE")){
        String name = verbindung.receive();
        while(name.equals(".") == false){
            ergebnis.add(name);
            name = verbindung.receive();
        }
      }
      return ergebnis;
  }
</code>
</code>

Version vom 28. März 2012, 17:09 Uhr


Typische Netzwerk-Protokolle

  • SMTP
  • POP3
  • IMAP
  • HTTP

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. 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 pMessage.substring(6); aufruft. Den Befehl kann man auf der Serverseite wie folgt abfragen: if(pMessage.startsWith("+BEFEHL"))
  4. Jede Nachricht startet mit einem Befehl
  5. Jede Antwort des Servers startet mit "-" oder "+" und einem Befehl
  6. Es gibt eine globale Rückmeldung für unbekannte Befehle, z.B. -UNKNOWN
  7. Es gibt eine globale Rückmeldung für fehlende Parameter oder Parameter zuviel, z.B. -param Parameterzahl falsch

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")){
        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:

Client sendet:

ALLE

Server antwortet:

+ALLE

max

martina

stefanie

justus

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 befehl = verbindung.receive();
     if(befehl.equals("+ALLE")){
        String name = verbindung.receive();
        while(name.equals(".") == false){
           ergebnis.add(name);
           name = verbindung.receive();
        }
     }
     return ergebnis;
  }