【发布时间】:2015-04-16 12:07:05
【问题描述】:
我的客户有数百个硬件设备需要通过 telnet 接口发送 HTTP 数据。
目标是一个 Apache 2 Web 服务器,其中有一个 PHP 脚本 等待数据。
这已经工作了,但是我们发现所涉及的硬件无法处理硬件流控制,这意味着一旦数据被填充(大约 250 字节),缓冲区就会溢出,导致数据损坏。
修复硬件流程不是一个选项,“调制解调器”固件已关闭,供应商无法再修改,因为它是相当旧的硬件。
通常我们会使用这个:
POST / HTTP/1.1
Host: api.server
User-Agent: P8
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 767
VARIABLE=URLENCODED_DATA(total length 767 bytes)
这对于流控制来说可以很好地工作,但在我的情况下,767 字节太多了。
大约 200 字节后,缓冲区将被覆盖,一些字节会丢失。
现在让它工作的唯一当前方法是在发送到“调制解调器”时使用延迟,以便它可以及时清空它的缓冲区。然而,在现场,由于互联网连接不稳定且时间不可预测,这将不起作用。
我不是 HTTP 专家,我只是希望可以对包进行分片。
我考虑过使用"Connection: keep-alive" 或类似的东西。
我的主要问题:
有没有办法以较小的块将 POST 数据($VARIABLE)发送到 Apache 2 服务器,从而使 HTTP 服务器在内部将它们组合成一个流?
伪代码:
POST / HTTP/1.1
Host: api.server
User-Agent: P8
Content-Type: application/x-www-form-urlencoded
Accept: */*
Content-Length: 400
Connection: keep-alive
VARIABLE=URLENCODED_DATA(200 bytes)
END\n\n
一旦收到"OK",服务器就会在 TCP 流中响应。
发送下一个块:
VARIABLE=URLENCODED_DATA(200 bytes)
连接已关闭。
由于已达到 400 字节,进程已准备就绪,Apache 将 VARIABLE 转发到 PHP 脚本 POST 输入。
就像一个开放的 TCP 连接中的 HTTP 流控制。
也许有一个为此目的而构建的 HTTP 功能,或者可以“ab”用于以这种方式运行的东西。 keep-alive 只是一个猜测。
如果当前的 HTTP 协议没有这样的功能,我能想到的解决问题的唯一方法是在 PHP 端实现流控制。
我希望有比这更好的方法。
更新: 同时我发现了两个有趣的参数: 期望:100-继续 传输编码:分块
我需要的是两者的结合。 一个分块传输编码,在每个块之后期望 100-continue!
【问题讨论】: