0

TIdTCPClient次のコードを考えると、これは私のプログラムが実行されたときに私 と関係がある最初のコードです

try
  if not TCPclient.Connected then
  begin
     TraceInfo(TCPclient.Host + ' Server not connected - reconnect');
     TCPclient.Connect();

     TCPclient.GetResponse(200);
     ConnectedToServer();
     TraceInfo(TCPclient.Host + ' Connect OK');
  end;

except   // when trying to connect to server
    on EIdAlreadyConnected : Exception do
    begin
       TraceWarning(TCPclient.Host + ' Attempt to Connect when already connected');
    end
    else    // Failed to connect for any other reason
    begin
       TraceError(TCPclient.Host + ' Connect FAILED !!!!');
       Exit; 
    end;
end;

// we either connected or noticed that we were already connected
try
  resultCode := TCPclient.SendCmd(theMessage);
  if resultCode = 200 then
  begin
     TraceInfo(TCPclient.Host + ' Sent OK');
     Result := TCPclient.LastCmdResult.Text.Text;
     DisconnectFromServer(TCPclient);
     Exit;
  end
  else
  begin
     TraceWarning(TCPclient.Host + ' Send rejected by server (result code = ' + IntToStr(resultCode) + ') !!!!');
      DisconnectFromServer(TCPclient);
      Exit;
  end;

except
  on E : Exception do       // EIdNotConnected
  begin
     Result := '';
     TraceError(TCPclient.Host + ' Send FAILED (exception "' + E.ClassName + '")');
  end;

終わり;

トレース ログに表示される理由がわかりません

00:00:00 [10.21.18.211 Server not connected - reconnect]    12:21:38 PM
00:00:01 [10.21.18.211 Attempt to Connect when already connected]   12:21:40 PM
00:00:01 [10.21.18.211 FAILED to connect to server] 12:21:40 PM
00:00:01 [10.21.18.211 Send FAILED (exception "EIdNotConnected")]   12:21:40 PM

私のコードで明らかに間違っていることを誰かが見ることができますか? または、あなたが私を助けるのを助けるために、私はより多くの情報を提供できますか?

前もって感謝します


明確にするために、更新:

どうすれば持つことができますか

TCPclient.Connected でない場合は、TraceInfo(TCPclient.Host + ' サーバーが接続されていません - 再接続') を開始します。

その後

 TraceError(TCPclient.Host + ' Send FAILED (exception "' + E.ClassName + '")');
4

2 に答える 2

3

内部的にConnected()、読み取り操作を実行してソケットの状態を判断します。IOHandler.InputBufferが空でない場合は、ソケットが物理的に切断されていてもTrueConnected()を返します。 Connect()Connected()内部的に呼び出され、True が返されるとEIdAlreadyConnected例外が発生します。そのため、最初の への呼び出しが新しいデータを受信し、2 番目の への呼び出しがTrue を返す原因Connected()となっている可能性があります。Connected()Connected()

于 2012-08-15T18:44:44.173 に答える
2

ConnectedToServer()プロシージャ/メソッドのリストを提供していません。この手順でTCPclientオブジェクトに接続しようとすると、結果が説明されます。

于 2012-08-15T06:58:05.643 に答える