TsgcTCPClient › 메서드 › WriteAndWaitData

WriteAndWaitData Method

메시지를 보내고 서버가 일치하는 회신으로 응답하거나 시간 초과가 경과할 때까지 호출자를 차단합니다.

Overloads

오버로드 1

구문

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

Parameters

NameType설명
aTextconst String서버에 보낼 텍스트 페이로드입니다. 바이트는 프레이밍 헤더 없이 TCP 소켓에 직접 작성됩니다.
aTimeoutconst 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);

Overload 2

구문

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

Parameters

NameType설명
aStreamconst TStream내용이 원시 바이트로 소켓에 기록될 소스 스트림입니다. 호출자는 스트림의 소유자로 남습니다.
aSizeconst Integer선택적 조각 크기(바이트)입니다. 0보다 큰 경우 나가는 스트림이 이 크기의 여러 청크로 분할됩니다. 전체 스트림을 단일 쓰기로 보내려면 0(기본값)을 사용하십시오.
aStreamingconst TwsStreaming조각화된 전송을 위한 스트리밍 모드(stmNone, stmStart, stmContinue, stmFinish). 기본값은 stmNone이며, 이는 스트림을 단일 독립 쓰기로 보냅니다.
aTimeoutconst 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;

메서드로 돌아가기