![]() |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Zitat:
|
AW: Probleme mit TIdTCPClient / TIdTCPServer
für tcp client server habe ich auf Source forge eine ganze Reihe von Demos bereitsgestellt < INDY 10 TCP CLIENT SERVER DELPHI >
Hilfreich ? |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Muss ich mal raussuchen und testen...
Sage dir dann Bescheid. Gruß Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Hallo Bernhard_LA,
habe mal das hier getestet: 1_sample Simple String Exchange Habe dort den Client genommen, IP und Port angepasst sowie das WriteLn rausgenommen, weil ich dem Server nix schicken muss, sondern NUR empfange. Dann habe ich das Programm gestartet und die Verbindung hergestellt (CheckBox) sowie den Button gedrückt, welcher jetzt nur noch das ReadLN ausführt gedrückt und da bleibt er dann ewig drinne stehen obwohl eigentlich was kommen müsste (Scanne die ganze Zeit Barcodes). Fazit: Geht damit also auch nicht. Verstehe das selber nicht ganz... Hier der angepasste Source:
Delphi-Quellcode:
PS: CheckBoxConnectDisconnet.Checked = True solltest du nicht abfragen :-) Dazu gibts hier jede Menge Diskussionsbeiträge. Ich habe das "= True" einfach weggenommen
procedure TClientForm.ButtonSendStringClick(Sender: TObject);
var LLine: String; begin //IdTCPClient1.IOHandler.WriteLn(Edit1.Text, TIdTextEncoding.Default); Edit1.Text := ''; LLine := IdTCPClient1.IOHandler.ReadLn(); if ( LLine = 'OK' ) then Memo1.Lines.Add('Server says it has received your String') else Memo1.Lines.Add(LLine); end; procedure TClientForm.CheckBoxConnectDisconnetClick(Sender: TObject); begin if ( CheckBoxConnectDisconnet.Checked ) then begin IdTCPClient1.Host := '172.20.22.124'; IdTCPClient1.Port := 50003; IdTCPClient1.Connect; end else IdTCPClient1.Disconnect; end; procedure TClientForm.IdTCPClient1Connected(Sender: TObject); begin Memo1.Lines.Add('Client connected with server'); end; procedure TClientForm.IdTCPClient1Disconnected(Sender: TObject); begin Memo1.Lines.Add('Client disconnected from server'); end; Grüße Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Hi,
IdTCPClient1.IOHandler.ReadLn(); Wartet/Blockiert solange bis ein CR/LF kommt. In einem Project habe ich den TIdTcpClient in einem Thread eingesetzt.
Delphi-Quellcode:
Dort frage ich erst ab, ob Daten im Eingangspuffer vorhanden sind.
procedure TTcpClientThread.Execute;
var addNewLine : Boolean; noDataCounter : Byte; s : AnsiString; begin addNewLine := false; noDataCounter := 0; while (not terminated) do begin if FWait then begin self.Suspend; FWait := false; end; try if not tcpClient.Connected then begin try tcpClient.Connect; except on E:Exception do begin errorLog.addLog(0,'error','Routine <tcpClientThread.execute> '+E.ClassName+' '+E.Message ); sleep(500); end; end; end; if tcpClient.Connected then if not tcpClient.IOHandler.InputBufferIsEmpty then begin s:= tcpClient.IOHandler.InputBufferAsString; alarmFilter.getData(s); reports.getData(s); s:=''; noDataCounter := 0; addNewLine := true; end else begin sleep(100); inc(noDataCounter); if (noDataCounter > 5) and addNewLine then begin addNewLine := false; alarmFilter.getData(#13#10); end; end; except on E:Exception do begin errorLog.addLog(0,'error','Routine <tcpClientThread.execute> '+E.Message); tcpClient.IOHandler.CloseGracefully; end; end; end; tcpClient.Disconnect; end; Sind weche da, lese ich den Eingangspuffer aus. Grüße Klaus |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Ich habs! ;-)
Habe mir mal den TIdTelNet angeguckt und bisschen darin rumgelesen und einige Sachen "anders" vorgefunden :-) So funktioniert es jetzt: Host und Port sind im Objektinspektor eingetragen. Ich weiß, das dem Timer ist keine schöne Lösung. Mir ging es auch erstmal nur darum, dass es überhaupt geht :-)
Delphi-Quellcode:
Mit diesem Source kann ich erstmal weitermachen.
procedure TForm1.FormCreate(Sender: TObject);
begin if not IdTCPClient1.Connected then IdTCPClient1.Connect; end; procedure TForm1.FormDestroy(Sender: TObject); begin if IdTCPClient1.Connected then IdTCPClient1.Disconnect; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if IdTCPClient1.Connected then begin IdTCPClient1.IOHandler.CheckForDataOnSource(50); if not IdTCPClient1.IOHandler.InputBufferIsEmpty then begin Memo1.Lines.Add(IdTCPClient1.IOHandler.InputBufferAsString); end; end; end; Vielleicht habe ich damit ja jemanden auch geholfen, der mal vor einer ähnlichen Aufgabe steht. Grüße Alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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