delphi - 如何使用 Indy TIdTCPClient 实例从 Web 服务器检索完整的 HTTP 响应,包括响应主体?

标签 delphi http sockets indy rfc

我有一个 Delphi 6 应用程序,它使用 Indy TIdTCPClient 实例与 Web 服务器通信。我不直接使用 HTTP 客户端的原因是因为该服务器是一个图像流服务器,它使用相同套接字连接来接收开始流式传输的命令,就像它开始“推”回图像一样给你。换句话说,在您向它发送一个典型的 HTTP POST 请求后,它会回复一个 HTTP 响应,然后立即开始发送 JPEG 图像流。

我已经知道如何制作一个正确的 POST 请求并使用 TIdTCPClient WriteBuffer() 方法发送它,然后使用 ReadBuffer() 方法接收回复数据。我想做的是发送一个 POST 请求,然后要求 Indy 等待典型的 HTTP 响应,包括在有 Content-Length header 变量的情况下检索响应正文中的所有字节.我当然希望它保持 JPEG 帧完好无损,这些帧可能在接收队列中的 HTTP 响应之后堆积起来,直到我开始请求它们(也就是说,我不希望它在 HTTP 响应中包含任何 JPEG 帧)我的流媒体请求命令,直到我使用连续的读取调用请求它们。

有没有我可以在 TIdTCPClient 上调用的方法,它将完全检索带有正文内容的典型 HTTP 响应,仅此而已?我考虑过使用 SendCmd() 并检查 LastCmdResult 属性(类型:TIdRFCReply)作为响应,但我无法从Indy 文档如果它也检索响应正文内容如果有 Content-Length header 变量作为它返回的响应的一部分,我也无法判断它是否在响应后离开接收队列的其余部分完好无损。

在您发出开始流式传输的 HTTP 请求后立即推出 JPEG 帧流的 HTTP Web 服务器完成这种混合模式交互的最佳方法是什么?

此外,如果有一种聪明的方法让 Indy 使用 JPEG 帧 WINBONDBOUDARY 分隔字符串来拆分帧,而不是累积数据 block 并自己解析它们,请分享该技术。

最佳答案

读取 HTTP 响应的正确方法是首先逐行读取 CRLF 分隔的响应 header ,直到遇到空行,也就是 CRLF+CRLF 序列,然后您可以使用这些 header 来决定如何读取剩余的响应数据。 header 不仅会告诉您正在发送哪种流(通过 Content-Type header ),还会告诉您数据是如何构建的(Content-LengthTransfer-Encoding: chunked,特定于特定 Content-Type 的东西,等等)。

要接收 header ,您可以使用连接的 Capture() 方法,将其 ADelim 参数设置为空字符串。

之后如何读取剩余数据取决于流的实际格式/框架。如果不知道您接收的是什么类型的流,就无法建议您如何最好地阅读它,因为 HTTP 服务器使用了几种不同类型的流协议(protocol),而且其中大多数都没有标准化。提供该信息,然后我/我们可以向您展示如何使用 Indy 实现它。

您不能使用 SendCmd(),因为 HTTP 协议(protocol)不会以与该方法兼容的方式格式化其响应。

关于delphi - 如何使用 Indy TIdTCPClient 实例从 Web 服务器检索完整的 HTTP 响应,包括响应主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866902/

相关文章:

delphi - Delphi中的UDP文件传输

multithreading - TForm.Handle 线程安全吗?

java - 为什么服务器套接字不继续?

api - angular2 http.get() 不向服务器发送请求

java - 非测试设置中的 Wiremock

python - 如何在Python中通过套接字建立连接?

c++ - 从零开始构建 IP 语音

delphi - 口音编码

delphi - (Delphi) 用函数指针参数调用DLL

http - HTTP URL 参数顺序对缓存有影响吗?