2012-06-11 133 views
1

我有以下情況:TCP發送命令並等待輸出

function Mach3Code(Str: String): String; 
var StrOut: String; 
begin 
    StrOut := ''; 

    try 
    IdTelnet1.Connect(); 
    IdTelnet1.Write(Str); 

    StrOut := ''; // assign here return output; 

    finally 
    IdTelnet1.Disconnect; 
    end; 

    Result := StrOut; 

end; 

就行了「斯特勞特:=‘’;」我需要獲得服務器的文本輸出(這是一個tcp服務器,由我作爲Mach3插件在vc 2008中編寫)。

通常,客戶端發送「COMMAND1」,服務器回覆「ANSWER1#」或類似的東西。我需要的代碼等待答案,然後返回它,同步,因此我可以這樣做:

StrResult := Mach3Code('G0X300Y200'); 

和讀什麼服務器部分已經送給我的。

任何想法我可以如何解決這個問題?

+0

我不知道Delphi和它的對象,但有一個'Write'方法的對象理應有一個'Read'方法。 –

+0

與您的問題無關,但您是否必須每次連接/斷開連接?如果你經常調用這個函數,將會產生很多開銷。 –

+0

@JoachimPileborg:是的,它確實有讀取方法,但並不像預期的那樣工作。它只是掛起。連接/斷開連接不是問題,它很少被調用。 StrOut:= IdTelnet1.ReadLn('#') 這一個等待永遠...... – kkazakov

回答

0

TIdTelnet是一個異步組件,它不適合你正在嘗試做的事情。除非你是在處理實際Telnet協議,那麼你應該使用TIdTCPClient代替:

function Mach3Code(const Str: String): String; 
begin 
    Result := ''; 
    try 
    IdTCPClient1.Connect(); 
    IdTCPClient1.WriteLn(Str); 
    StrOut := IdTCPClient1.ReadLn('#');  
    finally 
    IdTCPClient1.Disconnect; 
    end; 
end; 
+0

這是我嘗試的第一件事。然而,結果是一樣的 - 永遠等待。之後我嘗試過使用TIdTelnet。 – kkazakov

+0

永遠等待意味着服務器沒有發送您期望的內容,或者您​​首先無法正確讀取它。請顯示服務器希望您發送的內容以及服務器實際發回的內容的完整示例。 –

+0

我已經完全像這樣實現它,但在一個線程中,它的工作原理! – kkazakov

0

接收分配數據類型TIdTelnetDataAvailEvent的事件處理程序idtelnet1的OnDataAvailable財產,我知道這是不同步的,但我會重新因素您的代碼以這種方式工作,因爲這是Telnet客戶端是如何設計工作。

未能創建您自己的TIdTCPClientCustom decendant並使用相關方法實現您自己的讀取線程。

+0

也許你是對的。我將嘗試在線程中異步重做我的代碼。問題是我的應用程序調用函數,想法是等待輸出,然後根據這個輸出繼續前進。問題是輸出可能需要一些時間才能返回(第二或第十,所以在這段時間內界面沒有響應...) – kkazakov