1

私は次の状況にあります:

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');

サーバー部分が私に送ったものを読んでください。

この問題を解決する方法はありますか?

4

2 に答える 2

0

データを受信するには、タイプTIdTelnetDataAvailEventのイベントハンドラーをidtelnet1のOnDataAvailableプロパティに割り当てます。これは同期ではないことはわかっていますが、このように機能するようにコードをリファクタリングします。これは、telnetクライアントが機能するように設計されているためです。

失敗すると、独自のTIdTCPClientCustom子孫が作成され、releventメソッドを使用して独自の読み取りスレッドが実装されます。

于 2012-06-11T21:13:40.823 に答える
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;
于 2012-06-12T00:57:48.563 に答える