Hallo Zusammen,
ich habe zur Zeit eine Anwendung die als Client/Server programmiert ist. Als ein (Rich)-Client der sich im LAN an eine Datenbank anmeldet und damit arbeitet...
Mein anliegen ist jetzt das ich von "irgendwo" per
TCP auf diesen Server zugreifen möchte, oberste Intention ist der Zugriff von einem PC im Internet auf die Datenbank. Dabei werfen sich eine Menge Fragen und auch Erfahrung auf:
- Datenbank-Server-Port freischalten: Nix gut! Einmal in Bezug auf Sicherheit und Tests haben gezeigt das die Latenzzeiten den Client alles andere als brauchbar machen...
- Dann benötigt der Client auch Dateien aus dem lokalen Netz von einem FileServer: Freischaltung ist unmöglich!
- VPN Verbindungen sind eine alternative, aber der administrative Aufwand ist zu hoch und je nach Leitung auch nicht praktikabel, wieder mal die Latenzzeiten...
Als denke ich an einen Application Server, habe da auch schon viele Sächelchen gefunden,
Midas, DataSnap, RemObjects etc etc. Alle diese Teile würden eine komplette Neuprogrammierung des Clients erfordern, da die Business-Logiken ja neu definiert werden um App-Server abgelegt werden müssten. Das ganze dann noch im Zusammenspiel mit dem Rich-Client.
Der nächste Gedanke also: Ok, fange einen neuen und abgespeckten Client an, der mit "irgendwas" kommuniziert, und genau darum geht es mir
Da ich aber keine fertige AppServer-Lösung, unter anderem wegen des finanziellen Aufwandes, nehmen möchte wollte ich einen einfachen Server selbst programmieren, Anforderungen (nach den ersten Überlegeungen):
- Multithreaded
- Robust Robust Robust! Vor allem in Sachen Verbindungsstabilität...
- Soll als Dienst laufen
Vom reinen Ablauf Stelle ich mir das so vor: Der Client wird gestartet und Verbindet sich mit dem Server auf Port XYZ. Setzt einen "Befehl" ab und bekommt eine Antwort, also in etwas wie bei einem RPC. Dazu habe ich die nun für mich wichtigsten Fragen:
- Sicherheit: Würde es reichen die Daten mittels AES zu verschlüsseln? Oder ist da sowas wie SSL und Zertifikate notwendig? Ich denke eine Art Zertifikat wird man eh benötigen um vom ersten Byte der Übertragung an gesichert zu arbeiten, sonst müsste ja erst ein Handshake stattfinden der "erschnüffelt" werden könnte?
- Komponenten: Welche Komponenten sind dafür notwendig ohne sich großartig um die reine Kommunikation kümmern zu müssen. Also einfachsterweise so was Client.Connect, Client.SendCommand, Client.WaitForAnswer und Client.ReceiveData. Auf dem Server Server.OnConnect, Server.OnCommand, Server.SendAnswer, Server.OnDisconnect.
- Protokoll: Dachte an Senden von Command-Strings die der Server parst, und als Ergebis eine
XML-Datei liefert, die unter anderem auch Binärdaten als UUencoded liefert. Hauptsache wird die Übertragung von
SQL-Befehlen, oder entsprechende Synomyme, und das liefern eines ResultSet, in welcher Form auch immer. Ist
XML gut dafür? Der Overhead für das generieren könnte groß sein? TQuery >
XML...
So, das war jetzt recht viel, aber ich denke man gut erkennen worauf ich hinauswill? Bitte keine Antworten wie "TSocket verwenden" oder "Nutze
Indy", ich weiss das es all diese Komponenten gibt, man sich aber sehr sehr tief darin einarbeiten muss um einen wirklich stabilen Server zu erhalten