TsgcTCPClient › メソッド › WriteAndWaitData
メッセージを送信し、サーバーが一致する返信を送信するか、タイムアウトが経過するまで呼び出し元をブロックします。
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| 名前 | タイプ | 説明 |
|---|---|---|
aText | const String | サーバーに送信するテキストペイロード。バイトはフレームヘッダーなしで TCP ソケットに直接書き込まれます。 |
aTimeout | const Integer | サーバーの応答を待機する最大時間(ミリ秒単位)。デフォルトは10000(10秒)。 |
サーバーから受信したテキストメッセージ、またはタイムアウトが切れた場合、接続がなかった場合、エラーが発生した場合は空文字列。(string)
WriteAndWaitData はプレーン TCP ソケットを介したリクエスト/レスポンス形式のやり取りのための便利なヘルパーです。文字列を生のバイトとして書き込み、次の受信テキストペイロードが到着するかタイムアウトが発火するまで、内部イベントで呼び出しスレッドをブロックします。TCP クライアントはメッセージをフレーミングしないため、ピアは OnMessage を通じてコンポーネントが公開できる自己区切りの返信を返す必要があります。呼び出しがブロックされるため、短いタイムアウトを使用する場合を除き、メイン UI スレッドから呼び出すべきではありません。サーバーが時間内に応答しない場合は空文字列が返されます。ソケットレベルの例外はトラップされ、OnError に転送されます。バイナリペイロードを送受信する必要がある場合はストリームオーバーロードを使用します。
クライアントが接続されていない場合、WriteAndWaitData は何も送信せず、タイムアウトを待たずに直ちに空文字列を返します。失敗は OnError を通じて Connection = nil とエラー Data not sent, the client is not connected or its handshake has not completed.(resourcestring S_ERROR_CLIENT_NOT_CONNECTED)で報告されます。このイベントはメソッドが返る前に呼び出し元スレッドで発生し、LastError にも同じテキストが保持されます。呼び出し元に例外は発生せず、クライアントも切断されません。この報告を省略するには、コード内で Options.RaiseDisconnectExceptions を False に設定してください。
vReply := oClient.WriteAndWaitData('REQUEST', 5000);
if vReply <> '' then
ShowMessage(vReply);
function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;
| 名前 | タイプ | 説明 |
|---|---|---|
aStream | const TStream | その内容が生のバイトとしてソケットに書き込まれるソースストリーム。呼び出し元がストリームの所有者のままです。 |
aSize | const Integer | オプションのフラグメントサイズ (バイト単位)。ゼロより大きい場合、送信ストリームはこのサイズの複数のチャンクに分割されます。ストリーム全体を単一の書き込みで送信するにはデフォルトの 0 を使用してください。 |
aStreaming | const TwsStreaming | フラグメント送信のストリーミングモード(stmNone、stmStart、stmContinue、stmFinish)。デフォルトは stmNone で、ストリームを単一のスタンドアロン書き込みとして送信します。 |
aTimeout | const Integer | サーバーの応答を待機する最大時間(ミリ秒単位)。デフォルトは10000(10秒)。 |
サーバーから受信したバイナリ返信を含む新しく割り当てられたストリーム。タイムアウトが切れた場合、利用可能な接続がなかった場合、またはエラーが発生した場合は nil。呼び出し元が返されたストリームを解放する責任があります。(TStream)
このオーバーロードはテキストオーバーロードのバイナリ版です。提供されたストリームを生バイトとして TCP ソケットに書き込み、OnBinary を通じて次の受信バイナリペイロードが届くかタイムアウトが発生するまで内部イベントで呼び出しスレッドをブロックします。TCP クライアントはデータをフレームでラップしないため、ピアはコンポーネントが個別メッセージとして配信できる自己区切り応答を送信する必要があります。呼び出しがブロックするため、長いタイムアウトでメイン UI スレッドから呼び出すことは避けます。サーバーが時間内に応答しない場合の戻り値は nil です。例外は捕捉されて OnError に転送されます。クライアントが接続されていない場合、このメソッドはタイムアウトを待たずに直ちに nil を返し、テキストオーバーロード で説明されているとおり、Connection = nil で OnError を通じて失敗を報告します。使用後はソースストリーム (呼び出し後) と返されたストリームの両方を解放します。
oRequest := TMemoryStream.Create;
try
oRequest.LoadFromFile('request.bin');
oReply := oClient.WriteAndWaitData(oRequest, 0, stmNone, 5000);
try
if Assigned(oReply) then
oReply.SaveToFile('reply.bin');
finally
oReply.Free;
end;
finally
oRequest.Free;
end;