XML-Protokoll über Socket implementieren

  • Hallo zusammen,


    ich möchte demnächst ein einfaches XML-Protokoll über eine Socket-Verbindung serverseitig implementieren. Das ist zunächst also ein "unverzweigtes" Frage-Antwort-Spiel also z.B sowas wie



    Frage ist: Wie implementiert man so etwas im Allgemeinen? Grundsätzlicher Ansatz ist mir klar, ich würde auf dem Inputstream lauschen (zB in einer Runnable), jeweils in von öffnendem und schließenden Tag eingeschlossene Brocken aufteilen, und gleichzeitig über einen Outputstream Daten rausschreiben. Nur: Gibt es da einen generellen Ansatz, wie man "das Protokoll als solches" handelt? Klar ist, dass ich parsen muss, wie und wo halte ich mir aber z.B. den aktuellen Stand der Kommunikation (also hat der Client schon "Hello" gesagt) und wie entscheide ich, auf welche Frage ich was antworte? Es muss ja eine Art Protokoll-Handler geben, gibt es da Standard-Herangehensweisen? Literatur?


    Viele Grüße,
    FargoTof

  • Hallo zusammen,


    ich bin mittlerweile ein gutes Stück vorangekommen, stehe aber noch vor einem kleinen Problem. Aktuell nutze ich zum Parsen eines via Socket hereinkommenden XML-String der Form


    HTML
    <Data>
        <Number>12345</Number>
        <Values>
       	 <Value1>false</Value1>
       	 <Value1>true</Value1>
       	 <Value1>false</Value1>
        </Values>
    </Data>


    einen ganz normalen XMLReader. Dafür öffne ich in einer Runnable erst den Port, setze InputStream usw. und parse dann in einer Endlosschleife:



    Da meine Klasse als ContentHandler fungiert, kann ich über die Methoden public void startDocument () usw. die Ereignisse des Parsers abfangen und entsprechend reagieren.


    Simulieren tue ich die Gegenstelle im Moment, indem ich mich von einem Laptop per netcat auf den geöffneten Socket verbeinde und dann die Daten einfach über den Socket schiebe. Jetzt gibt es drei Fälle:


    1. Ich schicke "Zeile für Zeile", also je bestätigt durch Drücken von ENTER
    2. Ich schicke das Ganze "in einem Rutsch", also füge in der Konsole alles ein --> Die CR/LF sorgen ja dafür, dass alle bis auf die letzte Zeile auch schon einzelnen gesendet werden; die letzte Zeile übertrage ich dann per ENTER
    3. Ich füge vorm Einfügen in die Konsole bereits eine weitere leere Zeile an, sodass auch hinter meiner eigentlich letzten Zeile noch ein CR/LF steht und auch diese schon mitübertragen wird.


    Diese drei Vorgehensweisen führen jetzt auch schonmal grunsätzlich zu verschiedenen vom Parser geworfenen Ereignissen:


    1. Das "</RobotData>" wirft ein startDocument (aber weder ein endElement, noch ein endDocument)
    2. dito
    3. Das "</RobotData>" wirft immerhin ein endElement (aber immer noch kein endDocument).


    Was kann es denn erstens mit diesen unterschiedlichen Verhaltensweisen auf sich haben und vor allem: Wie kriege ich es korrekt hin, sodass ich wirklich alle Ereignisse mitkriege?


    Viele Grüße,
    FargoTof

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!