TsgcWebSocketClient › Methods › WriteAndWaitData

WriteAndWaitData メソッド

テキストメッセージを送信し、サーバーがテキストメッセージで応答するか、タイムアウトが経過するまで呼び出し元をブロックします。

オーバーロード

オーバーロード 1

構文

function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;

パラメータ

名前タイプ説明
aTextconst StringWebSocketテキストフレームとしてサーバーへ送信するテキストペイロードです。
aTimeoutconst Integerサーバーの応答を待機する最大時間(ミリ秒単位)。デフォルトは10000(10秒)。

戻り値

サーバーから受信したテキストメッセージ、またはタイムアウトが切れた場合、接続がなかった場合、エラーが発生した場合は空文字列。(string)

解説

WriteAndWaitData は WebSocket を通じたリクエスト/レスポンス方式の交換を行う便利なヘルパーです。テキストフレームを送信してから、次のテキストメッセージがサーバーから届くかタイムアウトが発生するまで、内部イベントで呼び出しスレッドをブロックします。スレッドをブロックするため、短いタイムアウトを使用する場合を除き、メインの UI スレッドから呼び出してはなりません。サーバーが時間内に応答しない場合は空の文字列が返されます。ソケットレベルの例外はトラップされ、OnError に転送されます。バイナリペイロードを送受信する必要がある場合はストリームオーバーロードを使用してください。

クライアントが接続されていない場合、または WebSocket ハンドシェイクがまだ完了していない場合、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 に設定してください。接続が失われたために書き込みが失敗し、クライアントがすでに再接続している場合も、失敗は Connection = nil で報告されるため、新しい接続は開いたままになります。

使用例


vReply := oClient.WriteAndWaitData('ping', 5000);
if vReply <> '' then
  ShowMessage(vReply);

オーバーロード 2

構文

function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;

パラメータ

名前タイプ説明
aStreamconst TStream内容が WebSocket バイナリフレームとして送信されるソースストリーム。呼び出し元はストリームのオーナーのままです。
aSizeconst Integerオプションのフラグメントサイズ (バイト単位)。ゼロより大きい場合、送信ストリームはこのサイズの複数のフラグメントに分割されます。ストリーム全体を単一のフレームとして送信するにはデフォルトの 0 を使用してください。
aStreamingconst TwsStreamingフラグメント化された送信のストリーミングモード(stmNone、stmStart、stmContinue、stmFinish)。デフォルトは stmNone で、完全なスタンドアロンメッセージを送信します。
aTimeoutconst Integerサーバーの応答を待機する最大時間(ミリ秒単位)。デフォルトは10000(10秒)。

戻り値

サーバーから受信したバイナリメッセージを含む新しく割り当てられたストリーム。タイムアウトが切れた場合、利用可能な接続がなかった場合、またはエラーが発生した場合は nil。呼び出し元は返されたストリームを解放する責任があります。(TStream)

解説

このオーバーロードはテキストの もう一方のオーバーロード に対応するバイナリ版です。提供されたストリームをバイナリフレームとして書き込み、サーバーから次のバイナリメッセージが到着するかタイムアウトが発生するまで内部イベントで呼び出しスレッドをブロックします。ブロックするため、長いタイムアウトでメイン 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;

メソッドに戻る