TCP发送命令并等待输出

TCP发送命令并等待输出,tcp,delphi-7,telnet,indy,Tcp,Delphi 7,Telnet,Indy,我有以下情况: 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

我有以下情况:

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;
在“StrOut:=''”行中,我需要获取服务器的文本输出(这是一个tcp服务器,由我以Mach3插件的形式在vc 2008中编写)

通常,客户端发送“COMMAND1”,服务器用“ANSWER1#”或类似的方式进行回复。我需要代码等待答案,然后同步返回,这样我可以执行以下操作:

StrResult := Mach3Code('G0X300Y200');
并阅读服务器部分发送给我的内容


有什么办法可以解决这个问题吗?

要接收数据,请将类型为tidtelnetdataavailent的事件处理程序分配给idtelnet1的OnDataAvailable属性,我知道这是不同步的,但我会重新考虑您的代码以这种方式工作,因为这就是telnet客户端的工作方式


未能创建您自己的TidtcpClient自定义DeceDant并使用相关方法实现您自己的读取线程。

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;

我不知道Delphi及其对象,但是具有
Write
方法的对象也应该具有
Read
方法。这与您的问题无关,但您每次都必须连接/断开连接吗?如果您经常调用此函数,将产生很大的开销。@JoachimPileborg:是的,它确实有read方法,但不能按预期工作。它只是挂着。连接/断开连接不是问题,很少调用。StrOut:=IdTelnet1.ReadLn(“#”)这一个将永远等待…默认情况下,所有网络套接字都将阻塞,这意味着
read
等操作将阻塞,直到有数据要读取。您确定服务器正在发送响应吗?服务器正在发送响应,因为它与putty telnet连接正常工作。问题出在delphi应用程序中。这是我尝试的第一件事。然而,结果是一样的——永远等待。之后,我尝试使用TIdTelnet。永远等待意味着要么服务器没有发送您期望的内容,要么您一开始就没有正确阅读。请给出一个完整的例子,说明服务器希望您看到什么,以及服务器实际发送回什么。我已经完全像这样实现了它,但在一个线程中,它工作了!也许你是对的。我将尝试在线程中异步重做代码。问题是,我的应用程序调用这些函数,想法是等待输出,然后根据输出继续前进。问题是,返回输出可能需要一些时间(秒或十秒,因此在此期间接口没有响应…)