TsgcWebSocketClient › 方法 › WriteAndWaitData
发送文本消息并阻塞调用方,直到服务器以文本消息响应或超时为止。
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| 名称 | 类型 | 描述 |
|---|---|---|
aText | const String | 要作为 WebSocket 文本帧发送到服务器的文本载荷。 |
aTimeout | const 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);
function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;
| 名称 | 类型 | 描述 |
|---|---|---|
aStream | const TStream | 将作为 WebSocket 二进制帧发送的内容的源流。调用方保留流的所有权。 |
aSize | const Integer | 可选的片段大小(字节);当大于零时,传出流将被分割为多个此大小的片段。使用 0(默认值)以单个帧发送整个流。 |
aStreaming | const TwsStreaming | 分片传输的流模式(stmNone、stmStart、stmContinue、stmFinish)。默认为 stmNone,发送完整的独立消息。 |
aTimeout | const Integer | 等待服务器响应的最长时间(毫秒)。默认为 10000(10 秒)。 |
从服务器接收到的二进制消息的新分配流,如果超时、没有可用连接或发生错误则为 nil。调用方负责释放返回的流。(TStream)
此重载是文本重载(另一个重载)的二进制对应版本。它将提供的流作为二进制帧写入,然后在内部事件上阻塞调用线程,直到从服务器收到下一条二进制消息或超时触发。由于会阻塞,请避免在主 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;