【问题标题】:C++ "HTTP" Server - Chunked Data TransferC++“HTTP”服务器——分块数据传输
【发布时间】:2010-11-12 01:55:56
【问题描述】:

更新:感谢您迄今为止的帮助。我刚刚测试了从浏览器直接连接到它的程序,而不是通过 XMLHttpRequest。直接从浏览器运行完美无缺。

但是,此连接必须通过 XMLHTTPRequest 处理。根据 FireBug 的说法,它正在接收完整的响应(在这种情况下为 31 个字节)。它关闭连接,将 readyState 设置为 4。但 responseText 完全为空。


我正在创建一个接受连接并像 HTTP 服务器一样响应的 C++ 应用程序。我的目标是通过打开与此 C++ 应用程序的连接来创建一个实时聊天服务器,并在发送新消息时继续加载一个“页面”作为响应。我目前正在发回以下内容:

HTTP/1.1 200 正常\r\n
传输编码:分块\r\n
内容类型:文本/纯文本\r\n
\r\n

到目前为止,一切正常。使用 FireBug,我可以看到它正在正确接收和解释标头。但是,我不知道如何转发响应文本。我知道,在纯文本中,它会读作如下:

5
你好
8
再见

但是到目前为止,我尝试的每次迭代(使用 \r\n,没有 \r\n,将 \r\n 计为 2 个额外字节)都没有被浏览器正确读取为响应文本。有人可以帮忙制作一个合适的字符串作为响应文本发送吗?

【问题讨论】:

  • 你描述的是正确的(假设5\r\nHello\r\n8\r\nGood bye\r\n)。您可以使用telnet 设置服务器端作为响应发送的原始数据。这将有助于找出问题所在。
  • 感谢您推荐 telnet。我开始使用它(现在的代码是一个简单的 Echo 服务器),但停下来并尝试对其进行硬编码以避免不断输入标题。我现在已经通过直接连接测试了代码,它可以正常工作(并且一直如此)。只是 XMLHttpRequest 部分给我扔了一个曲线球。

标签: c++ http xmlhttprequest


【解决方案1】:

您应该以零长度块结束传输:

5
Hello
8
Good bye
0

否则浏览器不知道你已经完成了。

【讨论】:

    【解决方案2】:

    您正在尝试实现“HTTP Push”或 HTTP 流式传输等,问题是并非所有浏览器都能正确支持此功能,对于诸如 firefox/opera 等浏览器,您可以尝试 mime-type multipart/x-mixed-replace ,所以只要您保持连接有效并向下发送内容,firefox 应该会读取,但这在 IE 中不起作用...

    【讨论】:

      【解决方案3】:

      "Each chunk starts with the number of octets of the data it embeds expressed in hexadecimal followed by optional parameters (chunk extension) and a terminating CRLF (carriage return and line feed) sequence, followed by the chunk data"

      您是否使用十六进制表示您的长度?块长度后面的\r\n不应该计入长度。

      另外,尝试以 0 长度关闭页面。这会让你知道浏览器是否只是在解析之前进行缓冲。

      【讨论】:

      • 这是我用来检查输出的确切页面。经过一些额外的测试,我现在将其范围缩小到 XMLHttpRequest 的问题。似乎期望在响应中发送其他内容。
      • "5" 和 "8" 无论解释为十进制还是十六进制都相同。大于“9”的值在两种格式中有不同的表示。
      • 雷米,我知道。有时人们会简化他们发布的示例。
      猜你喜欢
      • 2018-02-23
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2023-04-05
      • 1970-01-01
      • 2013-10-13
      相关资源
      最近更新 更多