Hi,
im Bereich "Tutorial" wäre es nicht korrekt aufgehoben, daher mal hier...
Ich habe ein Testprojekt (XE3) mit ServerSocket und ClientSocket erstellt.
Es gibt einen "ClientManager", der die Mausereignisse erhält und mit dem Server kommuniziert und als Ergebnis ein Bitmap erstellt, das im Formular dargestellt wird.
Die Clientlogik läuft also in dem Manager und das Formular dient nur als grafische und Ereignisschnittstelle.
Im Servermanager auf der anderen Seite läuft eine eigenständige "Businesslogik" in einem eigenen Thread.
Änderungen in der Datenschicht (hier testweise alle paar Millisekunden) werden an die Clients geschickt, die die Daten empfangen und ein neues Bitmap erstellen.
So hält der Server einen kompletten Datenbestand und die Clients zeichnen sich entsprechend der übertragenen Daten.
Ein wenig könnte man das vielleicht mit einem simplen Spiel vergleichen.
Der Anwendungsfall macht natürlich wenig Sinn, aber
- ich habe zwei konkrete Fragen, die Ihr vielleicht beantworten könnt
- vielleicht können wir die Struktur der Anwendung verbessern und die mit Sicherheit vorhandenen problematischen Teile optimieren.
- vielleicht ist das ja für andere mal von Interesse
- evtl. könnte man auch ein etwas ernsthafteres Projekt daraus weiterentwickeln (vielleicht ein kleines Netzwerkspiel für die
DP oder das von Mavarik angedachte Ameisenprojekt?) um daran weiter zu lernen - nur so eine Idee...
Meine Fragen:
1) Bei mir arbeitet der Server oft deutlich (10-30 mal) langsamer als normal, wenn die Delphi-
IDE geschlossen ist. Starte ich die
IDE, läuft er wieder normal, schließe ich sie, ist er wieder langsamer. Das ist jedoch nicht immer so (im verlinkten Video z.B. nicht). Kann das jemand einordnen?
2) Ich erhalte einen "asnchronen Fehler" vom ServerSocket, wenn ein Client geschlossen wird.
Das Problem liegt darin, dass die in einem eigenen Thread laufende "Businesslogik" ständig (alle paar ms) Änderungsmeldungen an alle Clients verschickt. Ich habe zwar versucht, diese mit dem Mainthread zu synchronisieren, aber das reicht nicht.
Der zu schließende Socket hat wohl schon die Kill-Nachricht vom Server, befindet sich aber noch einen Moment in der Socketliste und wird somit vom BL-Thread noch mit beim Nachrichtenversand berücksichtigt. Das führt dann zu einem Fehler.
Ich finde keine Möglichkeit, die Kill-Nachricht rechtzeitig zu erkennen und somit keine Rundumnachricht mehr an den Kill-Socket zu senden.
Kann da jemand helfen?
Anbei das XE3-Projekt.
Die Bibliothekspfade müsste man bei Bedarf einrichten, so dass die Nachnutzung leider etwas aufwendiger wird (ggf. kann ich dazu noch eine Übersicht erstellen, was erforderlich wäre).
Die Exen sind in den Release-Ordnern. In den Ini´s könnte man andere Ports und für die Clients andere IPs eintragen (habe ich aber noch nicht getestet).
Hier ein Link zu einem Video:
https://youtu.be/mnoBtkIzEf4
(Sind aber 18 min, also lohnt sich nur, wenn Ihr direktes Interesse am Thema habt.)
Bin gespannt, ob das für irgendwen von Interesse ist...