Implementierung einer Kommunikation

Generic1

Top Contributor
Hallo,

ich möchte mit einem Server über ein Protokoll kommunizieren. Das Protokoll ist zwar nicht so schwierig, es werden aber Strings vom Server zu Client hin und hergeschickt und dazu hätte ich eine Frage.

Ich sende einen String zum Server z.B.: 01 ANFRAGE CLIENTID
und bekomme je nach ANFRAGE- Text eine Antwort als String 01 ANTWORT CLIENTID (ANTWORT, CLIENTID haben eine definierte länge, z.B.: 15 Zeichen ANTWORT, 20 Zeichen CLIENTID)
Je nach Antwort sende ich dann wieder eine ANFRAGE an den Server usw.

Das schaut für mich sehr nach State- Maschine aus und es gibt auch ein State- Diagramm, wo das dargestellt ist.

Meine Frage wäre jetzt, wie man das am Besten implementiert, Die Anfragen mit einem StringBuffer zusammenzustellen dürfte kein Problem sein. Was schon eher ein Problem ist sind die Antworten, da ich zuerst wahrscheinlich mit "substring" die einzelnen Sachen aus dem Protokoll heraussuchen muss (Antwort, ClientID,..) und dann leider kein switch - case für die Strings einsetzen kann.

Hat vielleicht jemand eine Idee wie man das am Besten machen kann ohne eine rießige if-else if wurst zu schreiben?
Vielen Dank,
lg
 
J

JohannisderKaeufer

Gast
Warum kannst du kein switch - case für deine Strings verwenden?

Wenn du die Strings vorab schon als Enums definieren kannst, machst du mit valueOf(Class<T> enumType, String name) aus dem String den Enum-Wert, den du nun in Verbindung mit Switch case nutzen kannst.

Oder du machst das ganze Objektorientiert.
Für jede Antwort einen ResponseHandler

Java:
Interface ResponseHandler{

boolean handles(String response);

handleResponse();
}

class ...{
Collection<ResponseHandler> handlers = ...

void registerHandlers(){
handlers.add(new AHandler());
handlers.add(new BHandler());
}

void handleResponse(String response){
  for(ResponseHandler handler: handlers){
    if(handler.handels(response)){
      handler.handleResponse();
      break;
    }
  }
}
}
 

Generic1

Top Contributor
Könntest du das mit dem OO Ansatz nochmal erklären, ganz hab ich das nicht verstanden. Für jede verschiedene Antwort gibt es einen eigenen Handler, ist dasd so? Und class ...{ implementiert ResponseHandler, oder?
Vielen Dank,
lg
 
J

JohannisderKaeufer

Gast
Nehmen wir an du hast einen Roboter
Java:
class Roboter{
  void turnLeft();
  void turnRight();
  void grab();
  ...
}

und nun bekommst du die Befehle über das Netzwerk in Form von Strings

Java:
String command = getCommand();

und möchtest das der Roboter diese nun dementsprechend ausführt. "left" bedeutet turnLeft, "right" für turnRight etc.

Dann kannst du sowas machen
Java:
public class TurnRightCommand implements ResponseHandler{
  public boolean handles(String command){
    return command.equals("right");
  }
  public void handle(Roboter robby){
    robby.turnRight();
  }
}

Das machst du für jeden Befehl.

Jetzt kannst du in deiner Netzwerkklasse folgendes machen
Java:
class Network{
  private Roboter robby = new Roboter();

  private Collection<ResponseHandler> responseHandlers = new ArrayList<ResponseHandler>();
  public Network(){
    //Handler Registrieren
    responseHandlers.add(new TurnRightCommand());
    responseHandlers.add(new TurnLeftCommand());
    ...
  }
  public void handleRequests(){
    String command = getCommand();
    for(ResponseHandler handler : responseHandlers){
      if(handler.handles(command)){
        handler.handle(robby);
        break;
      }
    }
  }

}

Du gehst also eine Liste durch und fragst jedes Element ob es mit dem Befehl etwas anfangen kann. Kann es etwas damit anfangen, dann lässt du dieses Element das ganze auch ausführen.

Nun kann man das ganze auch noch etwas geschickter Anfangen in dem man das Registrieren der Handler, nicht so macht wie hier beschrieben, sondern alle Handler in ein Package packt und dann dort nach allen Dateien sucht und per Reflection schaut ob sie vom Typ ResponseHandler sind und sie dann automatisch zur Liste hinzufügt.

Das ganze nennt sich auch Front Controller Pattern und findet z.B. in vielen Webframeworks Verwendung.

Der Vorteil gegenüber einem Ellenlangen if-else-Marathon liegt, darin das du jeden ResponseHandler einzeln Testen kannst. Ist ja eine recht überschaubare Klasse. Und die Klasse Network macht auch nicht viel mehr als zu entscheiden welches Objekt einen Befehl abarbeitet.
 

Generic1

Top Contributor
Ich hab das Ganze jetzt mit dem State- Pattern gemacht.
Was mich jetzt stört ist, dass ich in jedem meiner States etwas zum Server senden muss, d.h. das ich die Kommunikation zum Server maximal verteilt habe - jetzt bin ich wieder am überlegen ob ich nicht doch ein switch - case mache, das zwar nicht so schon ist aber da hab ich den Code wenigstens nur in einer Klasse.
Habt ihr einen Vorschlag dazu bzw. hat von euch schon mal jemand eine Kommunikation mittels State- Diagramm gemacht? .
lg
 

FArt

Top Contributor
Ich hätte auch das Kommando-Pattern vorgeschlagen, alternativ evtl. Status oder Strategie, das müsste man sich mal genau ansehen.
 

Generic1

Top Contributor
Könntest du das genauer beschreiben wie du das machen würdest.
So weit ich das verstehe, würdest du eine Klasse haben, die das senden und empfangen steuert, wenn ein String empfangen wurde, diesen auswerten und einem Objekt übergeben, welches zuständig dafür ist -> ich würde dann also eine Klasse haben, welche für die Server- Kommunikation zuständig ist und die weiteren Objekte für die Abarbeitung des empfangenen -> hast du das so gemeint?
lg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Implementierung einer Mehrsprachigkeit, wichtig ? Allgemeine Java-Themen 5
D Implementierung einer Rechteverwaltung Allgemeine Java-Themen 2
S Implementierung einer PluginArchitektur Allgemeine Java-Themen 5
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
L rotateLeft implementierung Allgemeine Java-Themen 2
R In der Ausgabe sollte anstelle des obersten Sterns ein "+" stehen nur scheitere ich bei der Implementierung Allgemeine Java-Themen 9
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Mutable objects und Implementierung von ChangeEvents Allgemeine Java-Themen 5
W Queue Implementierung Allgemeine Java-Themen 6
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
F Implementierung von Teilprogrammen [Java|Python] Allgemeine Java-Themen 7
I TimSort - Sortieralgorithmus - Erklärung und Pseudocode - Implementierung Allgemeine Java-Themen 2
L Implementierung eines AVT-Baums Allgemeine Java-Themen 2
ruutaiokwu burstsort-implementierung in java? Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
R "Countdown" Implementierung Allgemeine Java-Themen 5
K A*-Implementierung flexibler machen Allgemeine Java-Themen 4
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
S BlueJ Cäsar-Implementierung Allgemeine Java-Themen 6
S Implementierung Programmneustart Allgemeine Java-Themen 10
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
R Intervall-Implementierung mit selbstgebauter LinkedList Allgemeine Java-Themen 7
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
Kr0e Eigene RMI Implementierung Allgemeine Java-Themen 3
V Wie finde ich die konkrete Implementierung? Allgemeine Java-Themen 8
G Implementierung vom AKS-Test Allgemeine Java-Themen 11
R software implementierung Allgemeine Java-Themen 3
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
K Design / Implementierung Allgemeine Java-Themen 5
B jre browser implementierung ? Allgemeine Java-Themen 4
B Elegantere Lösung bei der Implementierung eines Interfaces Allgemeine Java-Themen 2
G Klasse Queue Implementierung in Java Allgemeine Java-Themen 4
G Eigene PrintService Implementierung. Allgemeine Java-Themen 5
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben