Beispiel: Synapse TCP, Server mit mehreren Clients

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Antworten
MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von MAC »

Ich hab mich in letzter Zeit mit Synapse und TCP beschäftigt und hab im Internet kein minimal-Programm gefunden.
Deswegen hab ich mal ein kleines (ca. 250 Zeilen Code) Beispiel zu einem Server mit mehren Clienten geschrieben.
Es ist quasi ein kleiner Chat, entweder schickt ein Client eine Nachricht an den Server, oder der Server antworted allen Clienten...
Es dient als kleiner Einstieg in Synapse, fühlt euch frei es als Vorlage für den Einstieg in Synapse zu verweden...

Version 1.0 - 08.12.2014
Betriebssystem: eigentlich jedes, welches Synapse unterstützt, getestet unter Windows 7
Ihr braucht die Synapse Quellen - http://synapse.ararat.cz/doku.php/download
Es handelt sich wirklich nur um eine Minimale Version in der das wesentliche Programmiert ist :)

Hinweis (danke theo): durch das Verwendungen von mehreren Threads muss man das Programm untereinander synchronisieren (http://wiki.freepascal.org/Multithreade ... se_TThread),
Die GUI in diesem Beispiel, macht das nicht (nur teilweise). Man sollte sich je nach Anwendungsfall überlegen ob die Klasse ihre Internen Events in ihrem eigenen Thread weitergibt oder immer ein Synchronize verwendet, bzw spätestens wenn man die Oberfläche ändert Syncronisieren. Hier ist das weggelassen um das wesentliche (die eigentliche TCP Verbindung) im Vordergrund zu halten.

Viel Spaß, ich hoffe das kann mal jemanden behilflich sein :)

Screenshot
Screenshot

Changelog:
1.0: Initial Version
1.1: Fixed GUI Update in MainThread.

Tag: Minimal Synapse Example, Tutorial, TCP, Client, Server, multiple Clients
Dateianhänge
synapseExample v1.1.zip
Version 1.1: Source + Win32 Exe
(873.99 KiB) 389-mal heruntergeladen
synapseExample v1.0.zip
Version 1.0: Source + Win32 Exe
(873.88 KiB) 240-mal heruntergeladen
Zuletzt geändert von MAC am Mo 8. Dez 2014, 12:12, insgesamt 2-mal geändert.

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von theo »

Eigentlich eine gute Sache, aber denkst du nicht, man sollte vielleicht TThread.Synchronize anwenden, bevor man mit dem GUI parliert?

http://wiki.freepascal.org/Multithreade ... se_TThread

Und dann verstehe ich persönlich nicht, warum man sich mit sowas abquält:

Code: Alles auswählen

setlength(master.Clients,length(master.Clients)+1);             

wenn es doch TList oder TObjectList gibt, wo ein simples "Add" ausreicht und was erst noch performanter ist.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von MAC »

Stimmt natürlich.
ich hab das behoben mit TThread.Synchronize(nil,@Form1.UpdateGUI); , wobei UpdateGUI die Änderung an dem UI vornimmt, ich weiß nicht ob man da nil übergeben darf, aber es scheint zu funktionieren :wink:

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von theo »

Und beim Server?
Komm, nimm dir nochmal Zeit, das Ganze zu überdenken.
Threads und Unicode habe eines gemeinsam: Sie eignen sich gar nicht für den Versuch-und-Irrtum Ansatz. :wink:
"Es scheint zu funzen" kann dich hier eines schönen Tages übel in den Hintern treten.

(Wobei das Problem nicht beim "Nil" liegt.)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von MAC »

danke für den Tipp,
Hinsichtlich der Probleme mit mehreren Threads könnte man da echt noch vieles verbessern.
Das würde aber noch einiges an Code benötigen, deswegen lass ich es hier aber einmal bewusst weg, schließlich soll es ein kleines Beispiel mit TCP sein und nicht "ein kleines Beispiel mit TCP und 300 Zeilen SyncronisationsCode" ;)
Ich schreibe mal eine Dicke Warnung in den Post, das man sich mit Multithreading auseinandersetzten soll :)

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Beispiel: Synapse TCP, Server mit mehreren Clients

Beitrag von theo »

MAC hat geschrieben:mit TCP sein und nicht "ein kleines Beispiel mit TCP und 300 Zeilen SyncronisationsCode" ;)


Darum geht's ja nicht. Ich glaube du erkennst den Ernst der Lage nicht. :wink:
Dein Beispiel kann auf Dauer nicht funktionieren. Es wird zu bösen Fehlern kommen.
Es geht nicht um Features, sondern um das grundlegende Funktionieren.
Wenn du es einfacher haben willst, dann lass einfach die Meldungen an das GUI weg. Das wäre vertretbar.

Antworten