Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Chat Server und Client mit Indy (https://www.delphipraxis.net/85054-chat-server-und-client-mit-indy.html)

julien 25. Jan 2007 12:49


Chat Server und Client mit Indy
 
Hallo!
Ich bin mit meinen Chat Client und Serverprogramm eigendlich schon ganz schön weit. Ich benutze dafür einige Indy-Komponenten. Es wird das Client-Server-Client-Prinzip verwendet. Kann mir bitte jemand eine optimale Lösung für das Übertragen der Benutzerliste geben?
Wie kann z.B. eine komplette String List, die die Benutzer enthält, an neue Clienten gesendet werden und dort die Benutzer in eine ListBox eingetragen werden?
Außerdem gibt es noch Probleme mit der Onlinestatusanzeige. Es soll in der Benutzer-ListBox der Clienten durch Farben angezeigt, welche Benutzer online (grün), welche Benutzer gerade etwas eingeben (blau) und welche Benutzer Abwesend sind (rot; kann am Clienten mit einer Checkbox eingestellt werden). Das funktioniert so weit nur in der ListBox gibts Probleme mit den Farben, da den jeweiligen Eintrag immer erst markiert werden muss, damit der Farbwert aktualisiert wird (liegt am Brush).
Außerdem muss ich noch ein PM-System integrieren aber dazu später mehr...

MfG julien

arbu man 25. Jan 2007 13:47

Re: Chat Server und Client mit Indy
 
Antwort: XML für die Übertragung verwenden. (siehe Jabber)

mfg, Björn

julien 25. Jan 2007 14:26

Re: Chat Server und Client mit Indy
 
Danke für den Tipp aber das hilft mir auch nicht weiter, da ich die Benutzerliste so gestaltet habe, dass den Clienten lediglich gemeldet wird, dass user x hinzugekommen ist bzw. user x gegangen ist. Ich übertrage doch nicht die ganze Benutzerliste, nur weil ein einziger Benutzer hinzugekommen ist oder gegangen ist :wink:. Habs ja hinbekommen... Aber nur noch zu der Sache mit der ListBox aber dafür mache ich einen anderen Thread auf.

MfG

supermuckl 25. Jan 2007 16:05

Re: Chat Server und Client mit Indy
 
also

Zitat:

Kann mir bitte jemand eine optimale Lösung für das Übertragen der Benutzerliste geben?
baue dir ein array of Tbenutzer und übertrage das per buffer übertragung mit sendbuffer

die abfolge geht dann so:

client: write-to-server "brauche benutzerliste"
client: warte auf benutzeranzahl+buffers
server: benutzerverwaltungsobjekt wird mit criticalsection.enter gelockt (damit bei user quit wärend die liste übertragen wird, es keinen fehler gibt wenn auf ein objekt zugegriffen wird, das nicht mehr da ist)
server: anzahl benutzer übertragen (integer)
client: empfängt benutzercount für schleife, die buffers empfängt
server: mit schleife alle benutzer per buffer übertragen (Tbenutzer)
client: schleife empfängt buffers der benutzer
server: benutzerverwaltungsobjekt wird mit criticalsection.leave ungelockt

client: neuaufbau der listbox
client: evtl refresh wegen farbgebung, falls das nicht korrekt funzt

Zitat:

Es soll in der Benutzer-ListBox der Clienten durch Farben angezeigt, welche Benutzer online (grün), welche Benutzer gerade etwas eingeben (blau) und welche Benutzer Abwesend sind
einfach die liste auf OwnerDrawFixed umstellen und in dem ereignis "OnDraw" alles selber zeichnen!
funzt definitiv (muss man nur richtig umsetzen)

Zitat:

Ich übertrage doch nicht die ganze Benutzerliste, nur weil ein einziger Benutzer hinzugekommen ist oder gegangen ist Wink. Habs ja hinbekommen... Aber nur noch zu der Sache mit der ListBox aber dafür mache ich einen anderen Thread auf.
durch die Tbenutzer arrays sind alle informationen der benutzer hinterlegt (schreibt gerade, ist away usw)
die benutzer arrays sind auf server und client in gleicher form enthalten (sonst würde man sie auch nicht über buffer senden und synchronisieren können)
auf der clientseite rennt ein thread in dem seiner execute procedure eine endlosschleife mit readln dauerhaft informationen vom server entgegennimmt und auf ein cmd entsprechend reagiert
kommt z.b. vom server "client quit <id>" dann kann der client das entsprechend auswerten das er z.b. auf das "quit" reagiert und dann im weiteren schritt die id nimmt und in der benutzerliste diese id eben löscht und die benutzer listbox wieder neu aufbaut.

julien 25. Jan 2007 16:24

Re: Chat Server und Client mit Indy
 
Hi! Danke für deiene Antwort.
Ehm... Also ich hab das nicht ganz so gemacht aber so ähnlich :-)
Ich habs so, dass sobald sich der Client auf dem Server einloggt, der Server die Benutzerliste erstmal vollständig sendet. Jede Aktion hat auf dem Server und auf den Clienten eine Bezeichnung (erster Buchstabe des gesendeten Strings vom Clienten und Server). Beispielsweise meldet sich ein Client beim Server mit ">Clientname" an und mit "<Clientname" wieder ab. Sobald ein Client sich eingeloggt hat, wird die Benutzerliste vom Server an diesen Clienten gesendet (mit "UClientname" in einer Schleife, bis alle Benutzernamen gesendet sind). Sobald ein Benutzer sich vom Server absendet, sendet der Server "EClientname" an alle Clients und dieser Benutzername wird aus der Benutzerliste entfernt. Wenn ein Client eine Nachricht abgesendet hat, sieht der String so aus: "BClientname: Nachricht". Der Status wird mit "OClientname" für Online, "AClientname" für Abwesend und "TClientname" dafür, dass ein Client gerade eine Nachricht eingibt. All das geht zuerst an den Server und wird dann an alle Clienten verteilt (außer PM's ("PClientname:Nachricht@Benutzer1@Benutzer2@... ").
Ich hoffe, das Prinzip ist soweit erstmal verstanden worden.

MfG julien


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz