我有数以百计的硬件设备在客户需要发送HTTP数据通过一个telnet接口。
目标是一个Apache 2 for服务器,其中有一个脚本等待数据。
但是我们发现所涉及的硬件无法处理hw流控制,这意味着一旦数据被填充(约250个字节),缓冲区就会溢出,导致数据损坏。
固定HW-流不是一个选项,“调制解调器”固件关闭,不能再被供应商修改,因为它是相当老的硬件。
通常我们会使用这个:
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)以较小块的形式发送到Apache2服务器,从而使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将变量转发到PHP脚本后输入。
就像打开的TCP连接中的HTTP流控制一样。
也许有一个HTTP特性是为此目的而构建的,或者是一些可以被“ab”用来这样做的特性。活着只是猜测而已。
如果当前的HTTP协议没有这样的特性,那么解决问题的唯一方法就是在PHP端实现流控制。
不过,我希望有一个更好的方法。
更新:同时,我发现了两个有趣的参数: Expect: 100-继续传输-编码:块
我需要的是两者的混合。一个分块的传输编码,它期待一个100-继续后每块!
发布于 2015-04-17 22:25:23
这是一个非常有趣的问题,它实际上与HTTP无关,而是与TCP有关。
解决这一问题的方法是使用一个中介代理,负责勺子喂养您的设备。理想情况下,该设备将能够将TCP数据包ACK上的窗口大小设置为该设备的缓冲区大小。当设备无法再处理时,该窗口大小将接近于零。如果您这样做,您将利用TCP的内置流控制,并以简单的方式解决问题。
您可以做的另一件事是将其完全保存在应用程序层中,并让这个中介代理缓冲区从响应中获取所有数据。对于大多数正常的HTTP响应,这是可以的。
https://stackoverflow.com/questions/29674238
复制相似问题