![]() |
Probleme mit TIdTCPClient / TIdTCPServer
Hallo zusammen,
ich habe folgendes Problem. Ein Scanner schickt beim Lesen einer Nummer ein String über TCP/IP. Mit Hyperterminal habe ich eine Verbindung zu dem Gerät aufgenommen (Eingabe der IP des Gerätes und des Ports) und ich sehe die gelesenen Nummern. Am Gerät selber kann ich nicht sagen, an welche IP er den gelesenen String schicken soll sondern nur ein Port kann man da einstellen. Jetzt bin ich mir ehrlich gesagt nicht ganz sicher ob ich ein Client oder Server auf meinem PC nehmen muss, um die Daten zu empfangen. Ich habe es mit dem TIdTCPClient versucht. Leider bekomme ich kein Text angezeigt. Code sieht so aus:
Delphi-Quellcode:
Oder welches Event müsste ich denn nehmen um die Daten abzufragen?
procedure TForm1.Timer1Timer(Sender: TObject);
begin if not IdTCPClient1.Connected then IdTCPClient1.Connect; if IdTCPClient1.Connected then begin IdTCPClient1.ReadTimeout := 250; Memo1.Text := IdTCPClient1.IOHandler.ReadLn(); end; if IdTCPClient1.Connected then IdTCPClient1.Disconnect; end; Gruß Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Ich könnte mir vorstellen, dass ein TCP-Server besser wäre, weil er auf eingehende Verbindungen wartet. Der Client verbindet sich ja aktiv zu einem Server, wenn man Connect aufruft.
Gruß, Michael |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Da ich im Scanner ja aber keine IP eingeben kann, wo er es hinschicken soll, muss ich ja ein Client auf meiner PC Seite nehmen, damit ich eine IP eingeben kann, mir der ich mich verbinden will. Beim Server kann ich die IP des Scanners ja nicht eingeben oder gibts da ein Trick?
Gruß Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Zitat:
Welches ist denn eingestellt, damit die Verbindung funktioniert? Möglicherweise ist TIdTelnet dann eine passende Komponente. Sie empfängt auch Daten von der Gegenseite. |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe Windows 7 und da ist kein Hyperterminal mehr dabei. Ich habe mir die XP Variante aus dem Netz gezogen und da kann man eindeutig TCP/IP einstellen. Siehe Screenshot.
Dann IP und Port eintragen und glücklich sein... Grüße AJ |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Zitat:
Also TIdTelnet verwenden, IP und Port eintragen, DataAvailable Event implementieren, die Verbindung aufbauen und ... glücklich sein :) |
AW: Probleme mit TIdTCPClient / TIdTCPServer
ich nutze aber nicht den Port 23. Ich nutze 50003 als Port. Das mit der 23 ist nur im Beispiel des Screenshots so.
Ich gucke mir mal das andere an, was du geschrieben hast. Gruß Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Ich pushe einfach mal :-)
Hat noch keiner mit dem TIdTCPClient gearbeitet und sich einfach mit einer IP und Port verwunden und von dort etwas empfangen? Gruß Alex |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Zitat:
Zitat:
Oder ohne eigenen Quelltext zu schreiben einfach mal auf der Kommandozeile telnet starten und verbinden: >telnet ipadresse 50003 und dann scannen, die Scandaten sollten dann auf der Konsole erscheinen |
AW: Probleme mit TIdTCPClient / TIdTCPServer
Das mit dem Telnet Befehl geht sogar :-)
Ich werde es dann mal mit der von dir vorgeschlagenen Komponente probieren. Trotzdem wäre es natürlich schön, wenn es mit dem TIDTCPClient auch gehen würde ;-) Grüße Alex |
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 09:19 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