2012-04-27 57 views
1

我跟着演示,事情工作得很好。我的客戶端有一個功能可以將命令發送到服務器並處理響應。INDY命令處理程序。成功迴應一個參數

這是很好的前幾個命令和我通過

var result : String; 
    TCPclient.SendCmd(theMessage); 
    TCPclient.GetResponse(Result); 

    if Result <> 'OK' then .... 

處理它當服務器發送

ASender.Reply.SetReply(200, 'OK'); ... or ... 
ASender.Reply.SetReply(400, 'NAK');  

現在,我想添加一個新的命令,結果將是NAK或ACK PLUS a值0,1或2

我對似乎有兩個參數,一個數字和響應Ë文本....

可以只是組裝機和發送「Ok0」,「OK1」或「OK2」,但是這是非常醜陋的(也可能是壞事)

我想我儘管爲了成功使用200並且在文本參數中發送0,1或2(或者使用'OK'並且發送0,1或2作爲數字代碼,或者使用200,201,202作爲數字代碼)?

有人可以幫助我瞭解我應該編碼什麼,爲什麼? (或者只是點我在URL)謝謝

回答

8

SendCmd()從服務器讀取你的反應,所以SendCmd()後,不要打電話,除非GetResponse()服務器實際發送兩個獨立的響應。

反應通常採取以下形式:

<Response Code> <Optional Text> 

當響應代碼是一個數字或文本關鍵字。

如果服務器發送數字響應代碼,處理這樣的:

服務器:

// sends: 
// 
// 200 1 
// 
ASender.Reply.SetReply(200, '1'); 

客戶:

if TCPclient.SendCmd(theMessage) = 200 then 
    Value := StrToInt(TCPclient.LastCmdResult.Text.Text); 

或者:

// raises an exception if a non-200 response is received 
TCPclient.SendCmd(theMessage, 200); 
Value := StrToInt(TCPclient.LastCmdResult.Text.Text); 

如果服務器發送te xtual響應代碼,處理這樣的:

服務器:

// sends: 
// 
// OK 1 
// 
ASender.Reply.SetReply('OK', '1'); 

客戶:

if TCPclient.SendCmd(theMessage, '') = 'OK' then 
    Value := StrToInt(TCPclient.LastCmdResult.Text.Text); 

或者:

// raises an exception if a non-OK response is received 
TCPclient.SendCmd(theMessage, ['OK']); 
Value := StrToInt(TCPclient.LastCmdResult.Text.Text); 

響應的可選的文本,如果存在的話,可以在TCPclient.LastCmdResult.Text屬性中訪問,這是一個TStrings,因爲它是可能的發送形式多行響應:

<Response Code>-<Optional Text> 
<Response Code>-<Optional Text> 
... 
<Response Code> <Optional Text> 

服務器:

// sends: 
// 
// 200-The value is 
// 200 1 
// 
ASender.Reply.SetReply(200, 'The value is'); 
ASender.Reply.Text.Add('1'); 

客戶:

TCPclient.SendCmd(theMessage, 200); 
Value := StrToInt(TCPclient.LastCmdResult.Text[1]); 

您也可以以這種形式的答覆後發送二次多行文本:

<Response Code> <Optional Text> 
<Secondary Text> 
. 

服務器:

// sends: 
// 
// 200 Data follows 
// Hello world 
// How are you? 
// . 
// 
ASender.Reply.SetReply(200, 'Data follows'); 
ASender.Reply.Response.Add('Hello world'); 
ASender.Reply.Response.Add('How are you?'); 

客戶:

TCPclient.SendCmd(theMessage, 200); 
TCPclient.IOHandler.Capture(SomeTStringsObj); 
+1

+1和答案。雷米,非常感謝你帶着這樣一個詳細的答案。我希望它能幫助別人。 – Mawg 2012-04-27 06:28:56