2012-04-05 9 views
2

Delphi XE2, so Indy 10.Suche nach sehr einfachem TIdCommandHandler bedingter Antwort Beispiel

Mein Client sendet einen Befehl, der von einem TIdCommandHandler meiner TIdCmdTCPServer verarbeitet wird.

Ich möchte in der Lage sein, einige Logik durchzuführen und entweder eine Erfolgs- oder eine Fehlschlagantwort zurückzugeben und auf dem Client für das zurück zu überprüfen.

Kann mir bitte jemand ein paar Zeilen Code als Beispiel zeigen? Danke im Voraus.

Antwort

2

Nun, hier ist die einfachste Demo.

enter image description here

eine IdCmdTCPServer zu Ihrem Formular hinzufügen, und einen Befehl hinzufügen, stellen Sie seinen Namen in der Command Eigenschaft, dachte ich, ich ursprünglich Antwort in OnCommand Veranstaltung wie diese handhaben soll:

procedure TForm1.IdCmdTCPServer1CommandHandlers0Command(ASender: TIdCommand); 
begin 
    //ASender.Response.Add('Hello'); // wrong way 
    ASender.Reply.SetReply(0,'HELLO'); 

end; 

Update Remy wies darauf hin, dass ich Response nicht verwenden sollte.

Damit Sie Erfolg oder Misserfolg zurückgeben möchten, ist es üblich, ein numerisches Ergebnis gefolgt von dem Zeichenfolgenwert zu verwenden. Jeder String in der Antwort-Strings Liste wird an den Client einen impliziten End-of-line übertragen zurück:

procedure TForm1.IdCmdTCPServer1CommandHandlers0Command(ASender: TIdCommand); 
begin 
    if DoSomething then 
    ASender.Reply.SetReply(0,'OK') 
    else 
    ASender.Reply.SetReply(999,'ERROR'); 

end; 

Die Idee mit dem IdCommandHandler und einem CmdTCPServer/Client ist, dass Sie die "RFC" -Stil von Protokollen folgen, welche sind ANSI/ASCII textbasiert. Die Antwort eines RFC-ähnlichen Internetprotokolls wird typischerweise über den Draht als Text mit einem numerischen Wert und einem Zeichenfolgenwert codiert. ASender.Response könnte verwendet werden, wenn Sie den Inhalt einer Zeichenfolgeliste benötigen und diesen als Antwort zurückgeben müssen.

Wie für den Client, ein question here suggests that TIdCmdTcpClient is not the most natural way to build the client for this server. Von ihren Namen hätten Sie gedacht, sie wären füreinander gemacht, aber es ist nicht genau. Für die meisten einfachen TIdCMDTCPServers, die Sie erstellen könnten, würden Sie feststellen, dass ein einfacher TIdTCPClient der einfachste Baustein ist, mit dem Sie Ihren Client starten können.

+2

'ASender.Response' ist die falsche Eigenschaft zu verwenden. Verwenden Sie stattdessen 'ASender.Reply', zB:' ASender.Reply.SetReply (123, 'FAILURE') '. 'Sender.Response' ist für den Versand von mehrzeiligen Texten gedacht, die den' ASender.Reply' ergänzen. Verwenden Sie dann auf der Clientseite die Methode 'TIdTCPClient.SendCmd()' und die Eigenschaft 'TIdTCPClient.LastCmdResult', um Befehle zu senden und die Antworten abzurufen. –

+0

+1 zu beiden. Nur um 100% klar zu sein ... wenn ich ASender.Reply einstelle, dann überschreibt das die "normaleReaktion"? Und der Kunde sucht danach ... wie? Vielen Dank für die Hilfe, Leute ... – Mawg

+0

Hoppla, tut mir leid, ich sehe nein, dass du das schon beantwortet hast. Danke .. und die Antwort – Mawg