TsgcTCPClient › Methods › WriteData
通过原始套接字向 TCP 服务器发送文本或二进制消息。
procedure WriteData(const aText: String; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone);
| 名称 | 类型 | 描述 |
|---|---|---|
aText | const String | 要发送到服务器的文本载荷。字节直接写入 TCP 套接字,不附加任何帧头。 |
aSize | const Integer | 可选的片段大小(字节);当大于零时,负载将被分割为多个此大小的块。使用 0(默认值)在单次写入中发送整个负载。 |
aStreaming | const TwsStreaming | 分片传输的流式模式(stmNone、stmStart、stmContinue、stmFinish)。默认值为 stmNone,即将载荷作为单独的写入操作一次性发送。 |
WriteData 将字符串作为原始字节在活动 TCP 连接上传输。与 WebSocket 客户端不同,没有文本帧头;对端接收的恰好是您发送的字节,因此双方必须在分隔符或长度前缀上达成一致。默认情况下,调用在调用方线程上运行,并在字节交付给套接字后返回。当 QueueOptions.Text 设置为 qmNone 以外的值时,消息将被排队,并从连接自身的线程实际发送,从而防止多个线程并发写入时产生锁定。任何套接字异常都将转发给 OnError。发送大型载荷或二进制数据时,请使用流重载。
当客户端未连接时,不会发送任何内容,该失败会通过 OnError 报告,并将 Connection 设为 nil,错误信息为 Data not sent, the client is not connected or its handshake has not completed.(resourcestring S_ERROR_CLIENT_NOT_CONNECTED)。该事件会在 WriteData 返回之前于调用线程上触发,且 LastError 保存相同的文本。不会向调用方引发异常,客户端也不会断开连接。在代码中将 Options.RaiseDisconnectExceptions 设置为 False 可跳过此报告,像早期版本一样静默丢弃该消息。当写入失败是因为其连接已丢失且客户端已经重新连接时,该失败同样会以 Connection = nil 报告,从而使新连接保持打开。
oClient.WriteData('Hello Server');
procedure WriteData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone);
| 名称 | 类型 | 描述 |
|---|---|---|
aStream | const TStream | 其内容将作为原始字节写入套接字的源流。调用方仍是流的所有者。 |
aSize | const Integer | 可选的片段大小(字节);大于零时,流将被拆分为此大小的多个块。使用 0(默认值)在单次写入中发送整个流。 |
aStreaming | const TwsStreaming | 分段传输的流模式(stmNone、stmStart、stmContinue、stmFinish)。默认为 stmNone,将流作为单个独立写入发送。 |
WriteData 从流的当前位置读取所提供的流,并将内容作为原始字节在 TCP 套接字上发送。由于 TCP 客户端不会将数据封装在 WebSocket 帧中,对端必须知道如何界定传入字节(通常通过长度前缀或应用层分隔符)。该调用默认在调用线程上运行;当 QueueOptions.Binary 设置为非 qmNone 的值时,消息将入队并从连接线程实际发出。套接字异常将被捕获并转发至 OnError。当客户端未连接时,不会发送任何内容,失败会通过 OnError 报告,并将 Connection 设为 nil,如文本重载中所述。请在调用返回之后(或在排队时,在发送完成之后)再释放流。
oStream := TMemoryStream.Create;
try
oStream.LoadFromFile('payload.bin');
oClient.WriteData(oStream);
finally
oStream.Free;
end;