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,不等待超时,并通过 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;