Hallo zusammen. Ich brauche mal wieder eine Idee.
Und zwar bin ich gerade dabei ein eigenes Serverprojekt zu schreiben. Funktioniert auch toll, sämtliche Fehler werden geloggt stabil alles gut halt.
Nun besteht mein Fenster aus zwei Teilen. Einmal der Logausgabe wie beschrieben und nun wollte ich unten noch eine Textbox einbauen um Befehle oder änderungen an den Server schicken zu können.
Was weiß ich, ein einfaches Kommando währe da /Shutdown
/Shutdown alleine soll dann den Server in 2 Minuten runter fahren (um alle Clients zu warnen)
/shutdown now sofort
/shutdown 10 halt in 10 Minuten usw.
oder
/set port 10000
/set name home_server
/set wasweisich auf was der admin halt so will.
Zuerst bin ich jetzt auf die Idee gekommen die Zeilen entsprechend mit Split zu zerlegen und dann nach und nach mit switch/cases zu hinterfragen was denn dahinter steckt.
Nur mit steigender Anzahl von Befehlen und möglichen Kombinationen switche ich mich da regelrecht irgendwann zu tode. Mal abgesehen von der Fehleranfälligkeit.
Ich müsste irgendeinen weg finden bei dem ich einen Befehl mit seinen möglichen Parametern usw. einfach hinzufügen kann und das system die Prüfung so übernimmt.
Mir schwebt da schon etwas vor, eine Klasse die befehlsbezogen dupliziert werden kann und mit entsprechenden Parametermöglichkeiten und Hilfsbezogenen Texten gefüttert wird. Aber irgendwie habe ich momentan ein Blackout mit der Umsetzung.
Danke schonmal im Voraus.
Seite 1 von 1
C# Commandoparser Zeilenparser der Serverbefehle auseinander nimmt und prüft
Anzeige
#2
geschrieben 19. November 2014 - 13:41
Ich denk da grad an eine Mischung aus beidem:
1- eine Klasse "Befehl" (virtuell) mit allen grundlegenden Eigenschaften und Methoden
2- eigene Klassen für jeden Befehl als Ableitung von "Befehl", die dann die befehlsspezifischen Eigenschaften und Methoden hinzufügen
3- ein "switch", welches jeweils nur den Befehl selber anguckt und damit dann ein Objekt aus der entsprechenden Klasse instanziiert
Bei der Instanziierung müßten dann die vom Benutzer übergebenen Parameter an den Konstruktor übergeben werden. Der müßte sich dann um die Validierung kümmern.
Fürs Parsing wären reguläre Ausdrücke sicherlich angenehmer als ein banales split(). Damit prüfst Du gleich mit.
Alternativ dürfte auch irgendeine Form von externem Schema wie zB XSD helfen. Dann müßtest Du einfach die Kommandozeile in XML parsen und dieses XML dann am XSD-Schema validieren.
1- eine Klasse "Befehl" (virtuell) mit allen grundlegenden Eigenschaften und Methoden
2- eigene Klassen für jeden Befehl als Ableitung von "Befehl", die dann die befehlsspezifischen Eigenschaften und Methoden hinzufügen
3- ein "switch", welches jeweils nur den Befehl selber anguckt und damit dann ein Objekt aus der entsprechenden Klasse instanziiert
Bei der Instanziierung müßten dann die vom Benutzer übergebenen Parameter an den Konstruktor übergeben werden. Der müßte sich dann um die Validierung kümmern.
Fürs Parsing wären reguläre Ausdrücke sicherlich angenehmer als ein banales split(). Damit prüfst Du gleich mit.

Alternativ dürfte auch irgendeine Form von externem Schema wie zB XSD helfen. Dann müßtest Du einfach die Kommandozeile in XML parsen und dieses XML dann am XSD-Schema validieren.
#3
geschrieben 19. November 2014 - 13:56
Mit dem regulären Ausdruck habe ich ja bereits gesplitet.
Wenn ich mit nem regulären Ausdruck aber auch gleich die richtige Syntax der Eingabe prüfe werde ich wahrscheinlich zu unflexibel. Weil einige Kommandos bestehen hat aus einem Befehl und einem bis drei optionalen Parametern, mal ist das dritte ne zahl, oder auch das zweite schon. Sicher könnte ich das alles in einem regulären Ausdruck definieren, der würde aber am Ende wahrscheinlich so gut wie jede Eingabe durch lassen. Ich glaube da werde ich mit Überladungen der Methoden eher was.
Aber ansonsten klingt deine Idee gar nicht schlecht. Mal an die Basisklasse ran gehen, mal sehen was draus wird.
Dachte so ein Commandoparser währe eine Standardproblemlösung oder zumindes ganz einfach. Aber neh, irgendwie ist es doch eine Herausforderung.
Wenn ich mit nem regulären Ausdruck aber auch gleich die richtige Syntax der Eingabe prüfe werde ich wahrscheinlich zu unflexibel. Weil einige Kommandos bestehen hat aus einem Befehl und einem bis drei optionalen Parametern, mal ist das dritte ne zahl, oder auch das zweite schon. Sicher könnte ich das alles in einem regulären Ausdruck definieren, der würde aber am Ende wahrscheinlich so gut wie jede Eingabe durch lassen. Ich glaube da werde ich mit Überladungen der Methoden eher was.
Aber ansonsten klingt deine Idee gar nicht schlecht. Mal an die Basisklasse ran gehen, mal sehen was draus wird.
Dachte so ein Commandoparser währe eine Standardproblemlösung oder zumindes ganz einfach. Aber neh, irgendwie ist es doch eine Herausforderung.
#4
geschrieben 20. November 2014 - 10:46
An sich ist RalphS's Idee nicht schlecht, wobei ich das alles defintiv über eine XML realisieren tät.
Beispiel-Thema: Master/Detail-Muster mit hierarchische XML-Daten:
http://msdn.microsof...=vs.110%29.aspx
Hier kannst du eine Liste von Befehlen in der Master-Listbox definieren und die Details spezifisch (in diesem Fall: Params) in einer untergeordneten Listbox darstellen
Vorteil hierbei: Ich muss nur die XML anfassen.
Beispiel-Thema: Master/Detail-Muster mit hierarchische XML-Daten:
http://msdn.microsof...=vs.110%29.aspx
Hier kannst du eine Liste von Befehlen in der Master-Listbox definieren und die Details spezifisch (in diesem Fall: Params) in einer untergeordneten Listbox darstellen

Vorteil hierbei: Ich muss nur die XML anfassen.
Dieser Beitrag wurde von Decay bearbeitet: 20. November 2014 - 18:29
- ← Python TCP asynchat Kommunikation mit anderen Programmen
- Programmierung
- Programmierer gesucht ! League of Legends →
Thema verteilen:
Seite 1 von 1