![]() |
indy Server und Client komponente
Hi,
ich benutze die Indy Komponente um von einem Client an den Server Daten zu senden. von Client zum Server funktioniert alles wunderbar, aber vom Server zum Client gibt es immer einen Socket Error. Kann es sein, das die IP des clients nicht korrekt ist, da dieser hinter einen Router steckt? Wenn ja, wie kann man das Problem lösen? |
AW: indy Server und Client komponente
Guten Abend,
server (öffentliche IP-Adresse) ---- (öffentliche IP-Adresse)-Router-(private IP-Adresse)-Client Wie versuchst Du denn vom Server den Client zu erreichen? Wenn Client zum Server funktioniert, dann ist (TCP vorausgesetzt) eine Verbindung zustande gekommen. Eine TCP Verbindung ist in der Regel nicht unidirektional. D.h. der Server kann über den gleichen Weg/die gleiche Verbindung etwas zum Client schicken. Grüße Klaus |
AW: indy Server und Client komponente
Zitat:
|
AW: indy Server und Client komponente
Entschuldigung, war leider etwas beschäftigt.
Fehler wenn ich vom Server zurück senden möchte ist "Connection Time out" So sende ich dann zurück:
Delphi-Quellcode:
Also sobald ich eine Nachricht vom Client erhalte, setze ich als Host seine Ip ein und möchte zurück senden.procedure TForm1.TCPServerExecute(AContext: TIdContext); begin TCPClient.Host := AContext.Binding.PeerIP; TCPClient.Connect; if TCPClient.Connected then begin TCPClient.IOHandler.WriteLn('bla bla'); TCPClient.Disconnect; end; end; |
AW: indy Server und Client komponente
Zitat:
Die darf der Server darf nicht einfach "wiederverwenden". Eigentlich sollte man, um diesen Fehler auszuschliessen getrennte Projekte anlegen (eines für Clients, und eines für Server). Der Server hat ja schon seit dem Verbindungsaufbau eine stehende Clientverbindung. Deren Socket (IOHandler) kann vom Server benutzt werden um Daten an den Client zu senden. Nur muss der Server dazu auch die 'richtige' Connection finden, falls mehrere Clients mit dem Server verbunden sind. Ich habe aber gerade keinen kompletten Beispielcode zur Hand, eigentlich müßte in den Indy Demos etwas sein... |
AW: indy Server und Client komponente
Hallo,
im Prinzip sollte es so gehen.
Delphi-Quellcode:
Grüße
procedure TConfigService.onExecute(AContext: TIdContext);
begin AContext.Connection.IOHandler.ReadBytes(key,16); // TCP server liest AContext.Connection.IOHandler.Write(buffer.Size); // TCP server schickt etwas zum client AContext.Connection.IOHandler.Write(buffer,buffer.size); // wie oben end; Klaus |
AW: indy Server und Client komponente
Zitat:
Wichtiges Detail: OnExecute wird vom TIdTCPServer in einer Schleife immer wiederholt (bis die Verbindung endet). Man kann den Code noch etwas CPU freundlicher machen ( ![]() |
AW: indy Server und Client komponente
Danke, nun klappt alles :)
|
AW: indy Server und Client komponente
Hier die stromsparende Variante, nach
![]()
Delphi-Quellcode:
p.s. in diesem Beispiel sendet der Client einen Request, der dann vom Server verarbeitet wird.
procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var RxBuf: TIdBytes; begin RxBuf := nil; with AContext.Connection.IOHandler do begin if InputBufferIsEmpty then begin CheckForDataOnSource(10); if InputBufferIsEmpty then begin Exit; end; InputBuffer.ExtractToBytes(RxBuf); // process RxBuf as needed... end; end; end; Es kann aber im OnExecute Handler als erstes eine Nachricht an den Client gesendet werden. Zum Beispiel, wenn der Server eine interne Queue von Daten hat, die er nach und nach an den Client senden soll. In diesem Fall würde der OnExecute Handler anders aufgebaut: * hole ein Element aus der Queue * falls kein Element vorhanden war, Exit * sonst: schreibe die Daten an den Client - AContext.Connection.IOHandler.WriteLn(Daten); * fertig (es sei denn, eine "synchrone" Quittung des Clients wird benötigt, dann weiter mit CheckForDataOnSource(TimeOut); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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