TsgcTCPClient › 方法 › WriteAndWaitData

WriteAndWaitData 方法

发送消息并阻塞调用方,直到服务器以匹配的回复响应或超时为止。

重载

重载 1

语法

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

参数

名称类型描述
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);

重载 2

语法

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

参数

名称类型描述
aStreamconst TStream其内容将作为原始字节写入套接字的源流。调用方仍是流的所有者。
aSizeconst Integer可选的片段大小(字节);当大于零时,传出流将被分割为多个此大小的块。使用 0(默认值)以单次写入发送整个流。
aStreamingconst TwsStreaming分段传输的流模式(stmNone、stmStart、stmContinue、stmFinish)。默认为 stmNone,将流作为单个独立写入发送。
aTimeoutconst Integer等待服务器响应的最长时间(毫秒)。默认为 10000(10 秒)。

返回值

一个新分配的流,包含从服务器接收到的二进制回复;若超时到期、无可用连接或发生错误,则返回 nil。调用方负责释放返回的流。(TStream)

备注

此重载是文本重载的二进制对应版本。它将提供的流作为原始字节写入 TCP 套接字,然后在内部事件上阻塞调用线程,直到通过 OnBinary 收到下一个入站二进制载荷或超时触发为止。由于 TCP 客户端不对数据进行帧封装,对端必须发送自界定的回复,以便组件将其作为离散消息传递。由于调用会阻塞,请避免在超时较长时从主 UI 线程调用。当服务器未及时回复时,返回值为 nil;异常将被捕获并转发至 OnError。当客户端未连接时,该方法会立即返回 nil,不等待超时,并通过 OnError 报告失败,将 Connection 设为 nil,如文本重载中所述。完成后请释放源流(调用后)和返回的流。

示例


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;

返回方法