Protokoll (IF): Unterschied zwischen den Versionen
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Informatik]] | [[Kategorie:Informatik]] | ||
[[Kategorie:Netzwerke(IF)]] | [[Kategorie:Netzwerke(IF)]] | ||
= Typische Netzwerk-Protokolle = | = Typische Netzwerk-Protokolle = | ||
Zeile 12: | Zeile 11: | ||
''SMTP, POP3 und IMAP werden im Unterricht thematisiert.'' | ''SMTP, POP3 und IMAP werden im Unterricht thematisiert.'' | ||
= Best | = Best Practices für die Entwicklung von Protokollen = | ||
''Diese Best | ''Diese Best Practices orientieren sich an dem, was man für das Zentralabitur braucht.'' | ||
'' | ''Ziel der Best Practices ist es, dass das Protokoll '''in jeder Situation funktioniert''' und dass es auf Client-Seite und auf Server-Seite '''einfach auszuwerten''' ist.'' | ||
# Das Protokoll beginnt damit, dass der Client die Verbindung zum Server herstellt. Dies wird im Protokoll notiert, z.B. als ''"stellt Verbindung her"''. | |||
# Das Protokoll muss '''vollständig''' sein, d.h. es muss für jede Situation eine Protokoll-Lösung geben. Z.B. auch für falsche Eingaben des Clients. | |||
# 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>''''' | ||
# '''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'''. "-" bedeutet Misserfolg, "+" bedeutet Erfolg. | ||
# Wenn ein Befehl mehrere Zeilen verschickt, dann wird als letzte Zeile ein einzelner Punkt verschickt. Dieser ist die '''Endmarke'''. | # 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. -UNBEKANNT <befehl> | |||
# Es gibt eine '''globale Rückmeldung für fehlende Parameter oder Parameter zuviel''', z.B. -PARAM <befehl> Parameterzahl falsch | |||
=Beispiel: GossipServer= | =Beispiel: GossipServer= | ||
== Spezifikation == | == Spezifikation == | ||
Der GossipServer soll dazu dienen, Tratsch (=Gossip) zu speichern und weiter zu verbreiten. Es gelten die folgenden Anforderungen: | Der GossipServer soll dazu dienen, Tratsch (=Gossip) zu speichern und weiter zu verbreiten. Es gelten die folgenden Anforderungen: | ||
Gossip schreiben: | |||
# Gossip schreiben: Man kann | # '''Gossip schreiben:''' Man kann die Verbindung zum GossipServer herstellen und (anonym!) eine neue Nachricht hinterlassen. Die wird als Text mit Datum/Uhrzeit gespeichert. Es werden nur Nachrichten in SMS-Länge akzeptiert. | ||
# Gossip abonnieren: | # '''Gossip abonnieren:''' Mithilfe eines geeigneten Befehls kann man den Gossip abonnieren. Der GossipServer schickt dem Client dann jede neu eintreffende Nachricht. | ||
# Gossip-Archiv lesen: Man kann alle Nachrichten | # '''Gossip-Archiv lesen:''' Man kann alle Nachrichten eines Zeitraums vom GossipServer abrufen, indem man einen geeigneten Befehl an den GossipServer schickt und dabei das Anfangs- und das Enddatum angibt. Der GossipServer schickt dann alle Nachrichten aus diesem Zeitraum mit Datum zurück. | ||
# '''Abmelden:''' Mithilfe eines geeigneten Befehls kann man die Verbindung zum GossipServer trennen. | |||
==Protokoll== | ==Protokoll== | ||
Das Protokoll besteht aus 3 Spalten: | Das Protokoll besteht aus 3 Spalten: | ||
* Client sendet | * Client sendet | ||
* Server | * Server antwortet (einem Client) | ||
* Server an alle | * Server an alle | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! Client sendet !! Server antwortet !! | ! Client sendet !! Server antwortet<br>(einem Client) !! | ||
Server an alle | Server an alle | ||
|- | |- | ||
Zeile 62: | Zeile 63: | ||
|} | |} | ||
''Für die '''Implementierung''' des GossipServers: siehe [[Netzwerkprogrammierung#Beispiel:_GossipServer|Netzwerkprogrammierung]]'' | |||
= Protokolle mit Java auswerten = | = Protokolle mit Java auswerten = | ||
Zeile 73: | Zeile 72: | ||
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){ | ||
if(pMessage.startsWith("-")){ | if(pMessage.startsWith("-")){ | ||
Zeile 96: | Zeile 95: | ||
//TODO: Fehlerfall! Nachricht startet weder mit "+" noch mit "-" | //TODO: Fehlerfall! Nachricht startet weder mit "+" noch mit "-" | ||
} | } | ||
</code> | </code> | ||
== Befehle auswerten, die mehrere Zeilen schicken == | == Befehle auswerten, die mehrere Zeilen schicken == | ||
Zeile 128: | Zeile 128: | ||
Das lässt sich so auswerten: | Das lässt sich so auswerten: | ||
<code> | <code> | ||
private Connection verbindung; | private Connection verbindung; | ||
Zeile 135: | Zeile 135: | ||
verbindung.send("ALLE"); | verbindung.send("ALLE"); | ||
List ergebnis = new List(); | List ergebnis = new List(); | ||
String | String antwort = verbindung.receive(); | ||
if( | if(antwort.equals("+ALLE")){ | ||
String name = verbindung.receive(); | String name = verbindung.receive(); | ||
while(name.equals(".") == false){ | while(name.equals(".") == false){ | ||
ergebnis. | ergebnis.append(name); | ||
name = verbindung.receive(); | name = verbindung.receive(); | ||
} | } | ||
Zeile 145: | Zeile 145: | ||
return ergebnis; | return ergebnis; | ||
} | } | ||
</code> | </code> |
Aktuelle Version vom 23. Januar 2022, 18:12 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.
Ziel der Best Practices ist es, dass das Protokoll in jeder Situation funktioniert und dass es auf Client-Seite und auf Server-Seite einfach auszuwerten ist.
- Das Protokoll beginnt damit, dass der Client die Verbindung zum Server herstellt. Dies wird im Protokoll notiert, z.B. als "stellt Verbindung her".
- Das Protokoll muss vollständig sein, d.h. es muss für jede Situation eine Protokoll-Lösung geben. Z.B. auch für falsche Eingaben des Clients.
- 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>
- Jede Nachricht startet mit einem Befehl
- Jede Antwort des Servers startet mit "-" oder "+" und einem Befehl. "-" bedeutet Misserfolg, "+" bedeutet Erfolg.
- 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. -UNBEKANNT <befehl>
- 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: Gossip schreiben:
- Gossip schreiben: Man kann die Verbindung zum GossipServer herstellen und (anonym!) eine neue Nachricht hinterlassen. Die wird als Text mit Datum/Uhrzeit gespeichert. Es werden nur Nachrichten in SMS-Länge akzeptiert.
- Gossip abonnieren: Mithilfe eines geeigneten Befehls kann man den Gossip abonnieren. Der GossipServer schickt dem Client dann jede neu eintreffende Nachricht.
- Gossip-Archiv lesen: Man kann alle Nachrichten eines Zeitraums vom GossipServer abrufen, indem man einen geeigneten Befehl an den GossipServer schickt und dabei das Anfangs- und das Enddatum angibt. Der GossipServer schickt dann alle Nachrichten aus diesem Zeitraum mit Datum zurück.
- Abmelden: Mithilfe eines geeigneten Befehls kann man die Verbindung zum GossipServer trennen.
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 |
<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;
}