![]() |
Normale TCP connection mit Indy10
Tag leute.
Ich werde hier mal wieder nicht schlauer.... Ich möchte eine Verbindung (TCP) zwischen einem Client und einem Server herstellen (geht), über diese Verbindung Strings hin schieben (quasi befehlsanweisungen) und dann einen String vom Server zurückkommen lassen. Der muss ja rückmeldung erstatten. Das geht nicht... Ich hab mit einen IDTCPServer und einen IdTCPClient gemacht. Dann einfach Host und Port gesetzt.
Delphi-Quellcode:
Geht auch.
procedure TForm1.SendClick(Sender: TObject);
var sendStr: String; begin SendStr:= (Edit1.Text+'|'+Edit2.Text+'|'+Edit3.Text); if not IdTCPClient1.Connected then begin IdTCPClient1.Connect; end; Label2.Caption:= BooltoStr(IdTCPClient1.Connected); IdTCPClient1.IOHandler.WriteLn(SendStr); end; Dann am Server:
Delphi-Quellcode:
Würde das theoretisch auch weiter ausgebaut funktionieren? (Es soll irgendwann ein Chat werden (nur eine Verbindung) quer durchs Netz. Also nicht in einem internen Netzwerk oder so.
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin IdTCPServer1.Active:= True; ListBox1.Items.Add(split(AContext.Connection.IOHandler.ReadLn(),'|',1)); end; Und wie bekomme ich den Server jetzt dazu, zu antworten? Danke |
Re: Normale TCP connection mit Indy10
Guten Abend,
in dem Ereignis onExecute bekommst Du als Paramter AContext übergeben. Um an den Client etwas zu schicken kannst Du AContext hernehmen.
Delphi-Quellcode:
Grüße
AContext.Connection.IOHandler.Write('...');
Klaus |
Re: Normale TCP connection mit Indy10
Ok. Danke.
Aber wie baue ich das ein? Also wenn ich das in die Prozedur mache, wo der client was sendet, und dann der server was zurückgibt, bleibt das Porgramm stehen. Und: Was mache ich, wenn ich nicht aus dem Kontext sondern aus irgendeiner Prozedur eine Rückgabe brauche? |
Re: Normale TCP connection mit Indy10
Zitat:
Ich denke es hängt, weil readln auf Daten wartet. Zitat:
Zitat:
dann mußt Du die ThreadListe des Servers durchgehen und den Clients die in der Liste stehen etwas schicken. (Oder Du führtst selber eine Liste und nutzt diese).
Delphi-Quellcode:
Es ist etwas ungeschickt, den Sever im onExecute zu aktivieren.
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin IdTCPServer1.Active:= True; ListBox1.Items.Add(split(AContext.Connection.IOHandler.ReadLn(),'|',1)); end; Wäre der Server da nicht schon bereits aktiviert würde das onExecute auch nicht ausgelöst werden. Grüße Klaus |
Re: Normale TCP connection mit Indy10
Ok. Das erschließt sich mir jetzt so weit ganz gut.
Einzige Frage, die noch bleibt: gibt es eine prozedur wie 'IdTCPServer1.OnReadLn' so? Also eine, die ausgeführt wird, wenn was reinkommt? Danke |
Re: Normale TCP connection mit Indy10
Zitat:
Aber die Routine onExecute läuft ja immer im Kreis solange wie der Client noch verbunden ist. Was Du machen kannst ist, im onExecute überprüfen wie der Buffer gefüllt ist.
Delphi-Quellcode:
Grüße
if not AContext.Connection.IoHandler.InputBufferIsEmpty then
begin // mache etwas mit dem Inhalt des Buffers end; Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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-2025 by Thomas Breitkreuz