2012-06-11 97 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