Hallo zusammen
Ich habe mit der INDY10 Komponente von Delphi ein einfaches Chatprogramm geschrieben, mit dem Textnachrichten untereinander ausgetauscht werden können. Diese funktioniert beim Halten der Verbindung (also kein connect und disconnect zwischen den Sendungen) auch so, wie gewünscht. Nun wollte ich das Programm annähernd verbindungslos gestalten, also nur eine Verbindung aufbauen, wenn diese auch benötigt wird und sie danach sofort wieder zu kappen. Bei zu schnellem Aufbauen und Kappen der Verbindung gehen mir jedoch Daten verloren. Benutzen tue ich zwei TIdTCPServer-Komponenten zum empfangen und eine TIdTCPClient-Komponente zum senden, die jeweils auf den Empfänger eingestellt wird. Schreibe ich das Programm um, so das die Verbindung ständig gehalten wird, funktioniert es problemlos. Meine Frage ist, kennt jemand eine Methode, um das Programm in der Client-Sende Routine solange warten zu lassen, bis die vorherige Verbindung tatsächlich abgebrochen ist (Ein Repeat until RSPPClient.Disconnected = False) bringt leider nichts und ein Sleep erscheint mir doch zu sehr die Holzhammermethode.
Wenn jemand eine Lösung für das Problem hat, wäre ich Ihm sehr dankbar. Die vorherrschende Methode ist leider die mit dem Verbindung halten bzw. einfach davon auszugehen, das inzwischen genug Zeit zwischen dem Connect und Disconnect verstrichen ist.
MfG
Quitzlinga
Technik : 2 TIdTCPServer zum empfangen (beide auf verschiedenen Ports)
1 TIdClient zum senden
Zum besserem Beispiel etwas Code aus meinem Programm
Client
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TRSPPBase.CastTextMessage(IP : String;TheMessage : string); var Msg : String;
begin Msg := Trim(TheMessage); try RSPPSend.Host := IP; RSPPSend.Connect; RSPPSend.IOHandler.WriteLn(Msg); RSPPSend.Disconnect; except on E : Exception do begin ShowMessage(E.Message); end; end; end; |
Server
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TRSPPBase.RSPPServerExecute(AContext: TIdContext); var Msg,IP : String; Client : TSimpleClient;
begin Client := getClient(AContext.Binding.PeerIP); IP := Client.DNS; Msg := AContext.Connection.IOHandler.ReadLn(); ... Verarbeitung der Nachricht end; |
Hier treten die Fehler auf
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TRSPPBase.RSPPServerConnect(AContext: TIdContext); var Client : TSimpleClient; IP : String;
begin IP := AContext.Binding.PeerIP; if not IPFound(IP) then begin Client := TSimpleClient.Create; Client.DNS := IP; Client.Name := 'Logging In'; Client.ListLink := ClientLB.Items.Count; ClientLB.Items.Add(Client.Name); Clients.Add(Client); CastTextMessage(IP,'/TEXT Verbindung hergestellt...'); CastTextMessage(IP,'/TEXT Willkommen bei RSPP V1.0...'); CastTextMessage(IP,'/TEXT Bitte Logindaten senden...'); CastTextMessage(IP,'/LOGIN'); end; end; |